【问题标题】:Fragment recreated after activity killed on low memory活动因内存不足而被杀死后重新创建的片段
【发布时间】:2014-02-19 20:36:14
【问题描述】:

我有一个Activity,里面有一个ViewPager。当创建活动时,会执行 asyncTask,当任务完成时,会使用结果数据创建 Fragment。(重要提示:如果没有此数据,Fragment 创建视图将崩溃,因为它明确需要该数据)

现在Fragment 创建后,我返回主屏幕,打开另一个应用程序等等并创建内存不足的情况。我的Activity 因为内存不足被杀了。

现在我打开任务管理器并再次单击我的应用程序。

Android 会尝试将所有内容重新显示在屏幕上。由于所有Activity 被杀死,数据也丢失了,但它仍然尝试重新创建片段,尽管没有数据并且我的应用程序崩溃了。

我能做什么?...我有两个解决方案(至少理论上的解决方案)

  1. 防止在恢复时重新启动活动(我该怎么做????)

  2. 防止片段创建视图使用数据,除非它存在

好吧,我确实实施了第二个解决方案。所以应用程序一开始不会崩溃,因为“不存在数据”是handeld。但我意识到 ViewPager 也与片段断开连接,因为井活动被杀死。所以我无法从活动中返回片段。

【问题讨论】:

    标签: android android-activity fragment low-memory


    【解决方案1】:

    多年后......遇到同样的问题,一个残酷的解决方案是在调用 super 之前将 savedInstanceSate 设置为 null :

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        savedInstanceState = null;
        super.onCreate(savedInstanceState);
    }
    

    【讨论】:

      【解决方案2】:

      不要执行异步任务 onCreate 而是在 onResume 中执行,以便在您的应用重新启动时调用

      至于片段,创建它或在异步任务的 onPostExecute 中调用它以确保加载数据。 (如果您在其他地方调用(如单击按钮),则通过布尔变量对其调用进行调节,并在 onResume 中将此变量设置为 false,并在异步任务的 onPostExecute 中将其设置为 true)

      还有一件事:您可能希望在异步任务中显示一个带有 (cancelable = false) 的进度对话框,以确保数据完整性并防止用户导航您的寻呼机,除非数据已完全加载, - 在 onPreExecute 中显示进度对话框,并在 onPostExecute 中显示(diss miss)它

      -- 希望对你有所帮助:)

      【讨论】:

      • 好吧,我已经在 onPostExecute 中创建了我的片段。但是当活动在内存不足时被杀死并且应用程序应请求被带到前面时,android会尝试自行重新创建片段而无需任何调用......那就是应用程序崩溃的时候......
      • 抱歉,我现在什么都想不起来,但一个快速的解决方法是用 try catch 将您的片段创建代码括起来,并且当您的内存不足的情况发生时,catch 将被调用,因此在 catch 内执行你的异步任务。让我知道这是否有效,祝你好运
      • 还有另一个问题......在我的活动中,我使用了viewpager。我创建了两个片段并将其附加到视图寻呼机,并在我的活动中不时从这些片段中调用一些方法。在应用程序因内存不足而被杀死并且重新创建的片段存在但与 viewpager somehome 没有连接之后。我可以不调用 MyFragment.mymethod().. 它说 MyFragment 为空
      • 我实在看不懂这种循环行为,如果你修改activity生命周期你可以清楚地看到由于内存需要而杀死一个应用程序,会导致应用程序从onCreate开始完全重新启动循环。就像应用程序的全新发布一样。这很奇怪,至于我,我没有想法。有更多经验的人可能比我更有帮助:/
      • 是的……我也是这么想的……为什么不是所有东西都按照它们应该被解雇的顺序开火!!!
      【解决方案3】:

      在Activity中,通过这段代码获取ViewPager中的Fragment

      fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.rewards_viewpager + ":"+position);
      

      然后

      fragment.doSomething();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-11
        • 2016-08-24
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 2020-03-15
        相关资源
        最近更新 更多