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 能承受我的大量数据吗?说实话 我不清楚.....请大佬告知~
上一篇下一篇

猜你喜欢

热点阅读