https://developer.android.com/jetpack/docs/guide
- 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
26public 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>>() {
public void onResponse(Call<BaseResponseModel<User>> call, Response<BaseResponseModel<User>> response) {
//保存到数据库中。可能需要刷新LiveData。具体看数据库是否能自动通知更新
}
public void onFailure(Call<BaseResponseModel<User>> call, Throwable t) {
}
}
);
}
} - Room:对象映射库。(也可以替换成Realm等数据库的方案)
### 网络状态1
2
3
4
5
6
7
8sealed 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)
}