欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 架构组件简单小结

程序员文章站 2022-06-16 16:47:52
...

Android官方提供了一组架构组件(Android Architecture Components)用来帮助开发者创建健壮、易测试和可维护的apps。包括Lifecycle、LiveData、ViewModel和Room Persistence Library。

Lifecycle

Lifecycle是一个包含组件(比如Activity或者Fragment)生命周期信息的类。Lifecycle用两种枚举来表示相关联的生命周期的状态。

  • Event
  • State
    Android 架构组件简单小结

    LifecycleObserver通过对方法添加注解的方式来监听组件的生命周期。

public class MyObserver implements LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
    }
}
aLifecycleOwner.getLifecycle().addObserver(new MyObserver());

LifecycleOwner

LifecycleOwner是一个只包含getLifecycle()方法的接口,表示这这个一个包含Lifecycle。LifecycleActivity 和 LifecycleFragment已经实现了这个接口,也可以在自定义的类中实现这个接口,不过这时候需要自己发送生命周期事件。

/**
 * Activity that implements {@link LifecycleOwner}.
 * <p>
 * This class is a temporary implementation detail until Lifecycles are integrated with support
 * library.
 */
public class LifecycleActivity extends FragmentActivity implements LifecycleRegistryOwner {

    private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);

    @Override
    public LifecycleRegistry getLifecycle() {
        return mRegistry;
    }
}

ViewModel

ViewModel是用来存储UI相关的数据,使得数据不受配置变化影响(比如旋转屏幕)。

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
        return selected;
    }
}

public class MasterFragment extends Fragment {
    private SharedViewModel model;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}

public class DetailFragment extends LifecycleFragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, { item ->
           // update UI
        });
    }
}

上面的例子可以看出ViewModel可以很方便的实现在Fragment之间传递数据。
ViewModel在配置信息变化时仍然保存着信息,因此它不应该包含任何的context相关的引用(需要applicationContext可以继承AndroidViewModel)。同时ViewModel也是有相应的生命周期,在我们自己的Activity销毁的时候会回调 onCleared()来清除资源。
Android 架构组件简单小结

ViewModel vs SavedInstanceState

   ViewModels提供了一种方便的方法来在配置更改中保留数据,但如果应用程序被操作系统杀死,则不会持久保存数据。
   例如,如果用户离开应用程序并在几个小时后返回,该进程将在此期间被杀死,而Android操作系统将从被保存的状态恢复活动。所有框架组件(视图、活动、片段)都使用保存的实例状态机制来保存它们的状态,所以大多数情况下,您不需要做任何事情。您可以使用onSaveInstanceState回调将自定义数据添加到这个bundle中。
   通过onSaveInstanceState保存的数据是保存在系统进程内存并Android操作系统允许你只保留少量的数据,所以这不是保存应用程序实际数据的好地方。

LiveData

LiveData是一个保存可以被观察的数据类,包含app组件的lifecycle。
如果Observer的生命周期处于STARTED or RESUMED,LiveData认为观察者处于活动状态。

public class LocationLiveData extends LiveData<Location> {
    private static LocationLiveData sInstance;
    private LocationManager locationManager;

    @MainThread
    public static LocationLiveData get(Context context) {
        if (sInstance == null) {
            sInstance = new LocationLiveData(context.getApplicationContext());
        }
        return sInstance;
    }

    private SimpleLocationListener listener = new SimpleLocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            setValue(location);
        }
    };

    private LocationLiveData(Context context) {
        locationManager = (LocationManager) context.getSystemService(
                Context.LOCATION_SERVICE);
    }

    @Override
    protected void onActive() {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
    }

    @Override
    protected void onInactive() {
        locationManager.removeUpdates(listener);
    }
}
  • onActive()
    意味着LiveData已经有了处于活动状态的观察者
  • onInactive()
    意味着LiveData已经没有观察者或者没有观察者处于活动状态
  • setValue()
    更新LiveData实例并通知观察者发生了改变
public class MyFragment extends LifecycleFragment {
    public void onActivityCreated (Bundle savedInstanceState) {
        Util.checkUserStatus(result -> {
            if (result) {
                LocationLiveData.get(getActivity()).observe(this, location -> {
                   // update UI
                });
            }
        });
  }
}

Transformations of LiveData

  • Transformations.map()
LiveData<User> userLiveData = ...;
LiveData<String> userName = Transformations.map(userLiveData, user -> {
    user.name + " " + user.lastName
});
  • Transformations.switchMap()
private LiveData<User> getUser(String id) {
  ...;
}

LiveData<String> userId = ...;
LiveData<User> user = Transformations.switchMap(userId, id -> getUser(id) );

只要有active状态的观察者,Transformations可以让LiveData转换自动进行,这种延迟计算的性质允许隐式地传递与生命周期相关的行为,而不需要添加显式的调用或依赖。

相关标签: android components