Architecture Components

Posted by アライさん on 2019年10月22日

https://developer.android.com/jetpack/docs/guide
alt

  • ViewModel:为指定的UI组件提供数据,负责与数据处理业务部分的交互。ViewModel可以直接调用网络获取数据,但一般分离出一个Repository模块。
  • LiveData:可观察的,数据持有者,遵守生命周期(不需要在onStop或onDestory中解除,会自动处理)。组件观察LiveData,进行改变。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //ViewModel
    public class UserProfileViewModel extends ViewModel {
    private String userId;
    private LiveData<User> user;
    //获取数据的Repository
    private UserRepository repository;

    public void init(String userId){
    this.userId = userId;
    repository = new UserRepository();
    user = repository.getUser(userId);
    }
    //LiveData的数据可以在activity中监听
    public LiveData<User> getUser(){
    return user;
    }
    }
    //activity中
    viewModel?.user?.observe(this,object : Observer<User?> {
    override fun onChanged(t: User?) {
    //user改变时,改变ui
    }
    })

  • Repository:实现数据获取(自己创建的类,并非第三方框架提供)。使得ViewModel不必关心数据具体的来源。如果需要数据缓存,在这里实现。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class UserRepository {
    public LiveData<User> getUser(String userId) {
    refreshUser(userId);
    final MutableLiveData<User> data = new MutableLiveData<>();
    //从数据库中读取data,直接返回
    return data;
    }

    //联网刷新user
    private void refreshUser(final String userId){
    NetService.INSTANCE.getUser(userId)
    .getAlarmList()
    .enqueue(
    new Callback<BaseResponseModel<User>>() {
    @Override
    public void onResponse(Call<BaseResponseModel<User>> call, Response<BaseResponseModel<User>> response) {
    //保存到数据库中。可能需要刷新LiveData。具体看数据库是否能自动通知更新
    }

    @Override
    public void onFailure(Call<BaseResponseModel<User>> call, Throwable t) {
    }
    }
    );
    }
    }
  • Room:对象映射库。(也可以替换成Realm等数据库的方案)
    ### 网络状态
    1
    2
    3
    4
    5
    6
    7
    8
    sealed class Resource<T>(
    val data: T? = null,
    val message: String? = null
    ) {
    class Success<T>(data: T) : Resource<T>(data)
    class Loading<T>(data: T? = null) : Resource<T>(data)
    class Error<T>(message: String, data: T? = null) : Resource<T>(data, message)
    }