在Android开发中,ViewModel组件是一个很好用的组件,它可以和Activity或fragment绑定且在旋转屏幕等操作时不会被销毁,只有在Activity执行了onDestroy时才会被销毁。我们在使用中可能会发现一个问题,官方是不推荐在ViewModel中使用Context的,但是我们一定要使用,该怎么办?
其实除了ViewModel组件,还有一种AndroidViewModel可以用。
看了下官方的代码,发现它继承了ViewModel:
public class AndroidViewModel extends ViewModel {
@SuppressLint("StaticFieldLeak")
private Application mApplication;
public AndroidViewModel(@NonNull Application application) {
mApplication = application;
}
/**
* Return the application.
*/
@SuppressWarnings({"TypeParameterUnusedInFormals", "unchecked"})
@NonNull
public <T extends Application> T getApplication() {
return (T) mApplication;
}
}
这里的精髓就是最后的getApplication方法,调用后返回一个application。
所以新建一个类继承AndroidViewModel,在需要传入Context的地方调用这个getApplication方法就行。
public class MyViewModel extends AndroidViewModel {
……………………
OkHttpClient okHttpClient = NetworkHelper.getOkHttpClient(getApplication());
……………………
}
在Activity中初始化:
MyViewModel myViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get(MyViewModel.class);