2011-12-12 84 views
3

我想要实现:Android的内存管理中的onStop活动(或关闭屏幕)

  • 减少活动的内存使用情况是在屏幕上不再,即另一个活动已经开始
  • 此活动仍然处于导航堆栈中的能力,所以我假设我将不得不重新构建onStart内onStop中销毁的内容,但不知道如何在所有视图/按钮均使用layout构建时如何执行此操作.xml的。

的情况:

我有一个Android应用程序,这是非常沉重的形象,但这些图片是静态的许多布局的,具有相同的背景,按钮图像,导航等头这导致我通过在layout.xml文件中指定所有的imageViews,它们的src属性和位置,可以非常容易地构建布局,而不会触及代码太多。而且这个工作很好,很容易起来和运行,但是现在有很多关于由于超过内存使用而关闭的报告。

在试图清理于是就

,并允许GC删除的图像和看法不在屏幕上,我读到一篇文章来(见问题的底部)的onDestroy方法中建议,抓住你的根保持元素在布局中递归地遍历树去除视图并将其解除绑定。但是,只有当后退按钮被按下时,才会触发,并且根据文档没有保证。

因此,当我将新活动推入堆栈并且不想清理刚刚离开屏幕的内容时,onDestroy并不能帮助我。但使用onDestroy方法的优势在于入口点从onCreate开始,所以视图都是正确构建的。当我在onStop中使用这个方法时,当我开始一个新的活动时,内存get得到了很好的清理,但是因为我已经使用layout.xml构建了所有的视图,所以我不明白我需要什么或者什么如果我在onStop中销毁所有内容,重新构建onStart,尤其是考虑到我从未在代码中创建任何视图,因为它们都是由layout.xml文件设置的。

主要问题:当我开始一个新的活动时如何清理内存?如果上下文处理正确,gc是否会清理所有不在屏幕上的图像并自动重新构建它?

这可以在onStop中以某种方式使用吗?

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    unbindDrawables(findViewById(R.id.RootView)); 
    System.gc(); 
} 

private void unbindDrawables(View view) { 
    if (view.getBackground() != null) { 
     view.getBackground().setCallback(null); 
    } 
    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
      unbindDrawables(((ViewGroup) view).getChildAt(i)); 
     } 
     ((ViewGroup) view).removeAllViews(); 
    } 
} 

回答

2

A) 使用的onCreate()/的onDestroy()将活动时在堆栈上得到时活性从堆栈中弹出分配,和unallocate。

B) 使用onStart()/ onStop()将在活动可见时进行分配,并在活动不可见时取消分配。

使用A)或B)。不要混合它们,否则你会经常分配或释放资源。在你的情况下,我会将所有从onCreate()到onStart()以及从onDestroy()到onStop()的所有东西都移动。

另外,还可以考虑使用this.setContentView(null)或this。的setContentView(新图())中的onStop(),以确保老的观点可以被垃圾收集:

@Override 
    protected void onStop() { 
    super.onStop(); 
    View root = findViewById(R.id.RootView); 
    setContentView(new View(this)) 
    unbindDrawables(root); 
    System.gc(); 
    } 
1

我不认为任何活动的回调都是做这个的理想场所。你的活动总是会变得非常缓慢。

我想你宁愿坚持图片,如果你可以,但你想放弃,如果系统需要资源。如果这(缓存)是你正在看的WeakReference是你的男人。看到这个将帮助你决定/理解的excellent article

此外,我不认为android打算让我们的开发人员担心从布局文件生成的视图gc'd。只要你没有强烈的意见,你应该没问题。