为了账号安全,请及时绑定邮箱和手机立即绑定

保持对象 onPause()

保持对象 onPause()

aluckdog 2021-09-29 10:14:24
我在使用 Android Fragments 时遇到了很多麻烦,我不知道为什么。每当我暂停应用程序(onPause())时,我都想在内存中保留一个对象。我有一个带有一些图层的 MapView。而且我想保留这些图层,这样每当我暂停和恢复应用程序时,地图就不必从头开始重新加载和重新创建它们。问题是,我无法使用 onSaveInstanceState() 保存它们。它们是对象,而不是基元。它们也来自一个库,所以我不能让它们实现 Serializable 或 Parcelable。我想在不诉诸于以下的情况下找到解决方案:android:configChanges="orientation|screenSize">到我的活动,因为它被认为是不好的做法。此外,它不适用于暂停和恢复应用程序时。我也试过this.setRetainInstance(true); // retain this fragment在我的片段的 onCreate() 上,但我也想避免它。无论如何都行不通。经过多次试验、错误和测试,我发现我的片段的 onSaveInstanceState() 甚至没有运行。每当我暂停和恢复应用程序时,我什至无法保留一个简单的布尔值。我读:使用 Save Instance State 保存 Android Activity 状态https://developer.android.com/training/basics/activity-lifecycle/recreatingsavedInstanceState 始终为 nullAmog 许多其他帖子,当然还有 Android 文档。我的一些代码:创建片段:    navFragment = FragNavigation.newInstance(); // keeping the reference to the navFragment    // setting up the viewpager    ViewPager viewPager = findViewById(R.id.vpMainViewPager);    MainPagerAdapter mainAdapter = new MainPagerAdapter(getSupportFragmentManager(), this);    mainAdapter.addFragment(navFragment);    viewPager.setAdapter(mainAdapter);试图在实例状态中保存一个简单的布尔值(记住:这甚至不会运行):@Overridepublic void onSaveInstanceState(@NonNull Bundle outState) {    super.onSaveInstanceState(outState);    Log.e(TAG, "onSaveInstanceState: is map loaded? " + mapIsLoaded );    outState.putBoolean("mapIsLoaded", mapIsLoaded);}并尝试加载它:@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    this.setRetainInstance(true); // retain this fragment    Log.e(TAG, "onCreate: null? " + (savedInstanceState == null) );    if (savedInstanceState != null)        mapIsLoaded = savedInstanceState.getBoolean("mapIsLoaded", false);}我错过了什么?我显然不明白什么。为什么暂停应用程序时很难保持值?
查看完整描述

2 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

我建议根据架构组件使用ViewModel存储 MapView 层。如果这不是一个选项,您可以使用活动getLastNonConfigurationInstance手动存储和检索对象。


查看完整回答
反对 回复 2021-09-29
?
慕标5832272

TA贡献1966条经验 获得超4个赞

 @Override

    public void onPause() {

        /**

         * store your data 


         */


        super.onPause();

    }


    @Override

    public void onResume() {

        /**

         * retrieve your data       

         */




        super.onResume();

    }


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 229 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信