Jetpack之SavedStateHandle应用
2020-12-14 本文已影响0人
TMAC_EAH
1.添加依赖
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0-beta01"
2.使用参考 (viewmodel)
public class IHomeFragmentModel extends ViewModel implements ViewModelKey {
public MutableLiveData<List<GetSlideshowListBean>> mBannerLiveData = new MutableLiveData();
SavedStateHandle mSavedStateHandle;
public IHomeFragmentModel(SavedStateHandle mSavedStateHandle) {
mBannerLiveData = mSavedStateHandle.getLiveData(KEY_BANNER);
if (mSavedStateHandle.contains(KEY_BANNER)) {
try {
Log.e("复活", "复活数据=" + mBannerLiveData.getValue().size());
} catch (Exception e) {
e.printStackTrace();
}
} else {
Log.e("复活", "当前无复活数据=");
}
this.mSavedStateHandle = mSavedStateHandle;
}
public boolean tryRestoreHistoryDataUnSucess(MutableLiveData target, String key) {
if (mSavedStateHandle.contains(key)) {
mSavedStateHandle.remove(key); // 用一次
if (target != null && target.getValue() == null) {
return true;
}
return false;
}
return true;
}
public void execBannerHttpRequest() {
if (tryRestoreHistoryDataUnSucess(mBannerLiveData, KEY_BANNER)) {
// 项目中用的是 okgo 封装成这鸟样了
HomeService.getSlideshowList2(new IHttpCallback<List<GetSlideshowListBean>>() {
@Override
public void onSuccess(List<GetSlideshowListBean> data) {
mBannerLiveData.postValue(data);
}
@Override
public void onError(String data) {
mBannerLiveData.postValue(null);
}
});
} else {
Log.e("复活", "获取历史数据成功了=");
}
}
}
3.定义的key~
public interface ViewModelKey {
String KEY_BANNER = "key_banner";
String KEY_GUESSYOULIKE = "key_GuessYouLike";
String KEY_LIVEHOTS = "key_LiveHots";
String KEY_LIVERECOMMEND = "key_LiveRecommend";
String KEY_LATESTCLASS = "key_LatestClass";
String KEY_WEATHERMONITOR = "key_WeatherMonitor";
String KEY_WEATHER = "key_Weather";
}
4.activity/fragment调用一致
public class A extends AppCompatActivity {
IHomeFragmentModel iIHomeFragmentModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
iIHomeFragmentModel = new ViewModelProvider(this,
new SavedStateViewModelFactory(BaseApplication.getInstance(), this)).get(IHomeFragmentModel.class);
iIHomeFragmentModel.mBannerLiveData.observe(this, new Observer<List<GetSlideshowListBean>>() {
@Override
public void onChanged(List<GetSlideshowListBean> data) {
if (data != null) {
// do something~
} else {
// do nothing
}
}
});
}
}
4.模拟杀死重建数据
1.应用切换到后台
2.执行命令 adb shell am kill 你的包名
3.打开应用
4.观看日志
正常打开
2020-12-14 14:55:55.975 27835-27835/com.sinochem E/复活: 当前无复活数据=
2020-12-14 14:55:57.603 27835-27835/com.sinochem E/复活: 更新banner数据命中=
切换后台干掉app后
2020-12-14 15:04:09.040 30802-30802/com.sinochem E/复活: 复活数据=1
2020-12-14 15:04:09.558 30802-30802/com.sinochem E/复活: 更新banner数据命中=
5.这样应用被杀死,数据被还原就完成,果然是真香~
6.bundle 能承受我的大量数据吗?说实话 我不清楚.....请大佬告知~