Android Jetpack 使用入门
- 使用liveData 和ViewModel
//jecpack版本
lifecycle_version = "2.2.0"
//liveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
//viewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
先看一下viewModel的吧
viewModel的生命周期
ViewModel的生命周期下图所示
先写一下ViewModel的小Demo
这个在上面图,可以看出他的生命周期finished差不多平行。ViewModel的生命周期会比创建它的Activity、Fragment的生命周期都要长。即ViewModel中的数据会一直存活在Activity/Fragment中。
如果系统销毁或重新创建界面控制器,则存储在其中的任何瞬态界面相关数据都会丢失。例如,应用可能会在它的某个 Activity 中包含用户列表。为配置更改重新创建 Activity 后,新 Activity 必须重新提取用户列表。对于简单的数据,Activity 可以使用 onSaveInstanceState() 方法从 onCreate() 中的捆绑包恢复其数据,但此方法仅适合可以序列化再反序列化的少量数据,而不适合数量可能较大的数据,如用户列表或位图。
ViewModel能为我们解决这个问题,ViewModel有自己独立的生命周期,屏幕旋转所导致的Activity重建,并不会影响ViewModel的生命周期.
首先呢,先写一个类来继承ViewModel,我在这里重写了一波onCleared()。(重写不重写都行)
public class MyViewModel extends ViewModel {
private String title = "";
@Override
protected void onCleared() {
super.onCleared();
Log.e("viewModel","清除数据");
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyViewModel myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
myViewModel.setTitle("豆豆飞");
Log.e("viewModel", "插入数据");
TextView title = findViewById(R.id.title);
title.setText(myViewModel.getTitle());
}
最后呢显示出来就是豆豆飞
先看一下ViewModelProvider()源码
public ViewModelProvider(@NonNull ViewModelStoreOwner owner) {
this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory
? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory()
: NewInstanceFactory.getInstance());
}
在创建ViewModelProvider中呢。这个里面会创建这个HasDefaultViewModelProviderFactory实例。这块可以去下面这个链接去看看
点击这里
这里的对象呢,是ViewModelStoreOwner,那我们为什么传入this时候不会报错呢
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyViewModel myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
myViewModel.setTitle("豆豆飞");
Log.e("viewModel", "插入数据");
TextView title = findViewById(R.id.title);
title.setText(myViewModel.getTitle());
}
}
点击AppCompatActivity 在看看
public class AppCompatActivity extends FragmentActivity implements AppCompatCallback,
TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider {
再点击FragmentActivity看看
public class FragmentActivity extends ComponentActivity implements
ViewModelStoreOwner,
ActivityCompat.OnRequestPermissionsResultCallback,
ActivityCompat.RequestPermissionsRequestCodeValidator {
最终呢,发现这个AppCompatActivity继承了FragmentActivity。FragmentActivty实现了ViewModelStoreOwner
来看看ViewModelStoreOwner中呢是什么
public interface ViewModelStoreOwner {
/**
* Returns owned {@link ViewModelStore}
*
* @return a {@code ViewModelStore}
*/
@NonNull
ViewModelStore getViewModelStore();
}
一个接口有一个返回一个ViewModelStore ()
public class ViewModelStore {
private final HashMap<String, ViewModel> mMap = new HashMap<>();
final void put(String key, ViewModel viewModel) {
ViewModel oldViewModel = mMap.put(key, viewModel);
//这里你放入新的ViewModel的时候,他回去查看该下表是否存在原来的ViewModel。如果有的话删除掉
if (oldViewModel != null) {
oldViewModel.onCleared();
}
}
final ViewModel get(String key) {
return mMap.get(key);
}
Set<String> keys() {
return new HashSet<>(mMap.keySet());
}
/**
* Clears internal storage and notifies ViewModels that they are no longer used.
*/
public final void clear() {
for (ViewModel vm : mMap.values()) {
vm.clear();
}
mMap.clear();
}
}
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
LifecycleOwner,
ViewModelStoreOwner,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner {
...
@NonNull
@Override
public ViewModelStore getViewModelStore() {
if (getApplication() == null) {
throw new IllegalStateException("Your activity is not yet attached to the "
+ "Application instance. You can't request ViewModel before onCreate call.");
}
if (mViewModelStore == null) {
//获取 NonConfigurationInstances,如果不为空再获取viewModelStore
NonConfigurationInstances nc =
(NonConfigurationInstances) getLastNonConfigurationInstance();
if (nc != null) {
// Restore the ViewModelStore from NonConfigurationInstances
mViewModelStore = nc.viewModelStore;
}
if (mViewModelStore == null) {
//如果未获取到,则创建ViewModelStore对象
mViewModelStore = new ViewModelStore();
}
}
return mViewModelStore;
}
...}
ComponentActivity 中呢,实现了ViewModelStoreOwner的接口。