【问题标题】:My Simple ListView app is leaking memory. What am I doing wrong?‏我的 Simple ListView 应用程序正在泄漏内存。我做错了什么?
【发布时间】:2011-05-12 05:27:19
【问题描述】:

首先,我确实先将它发布到了 android google 组,但它经过了审核,我不确定它需要多长时间才能出现,所以希望这里的人可以提供帮助。

我在 ListActivity 之后创建了一个带有 ListView 的简单应用 网上找的例子。

该应用程序有 2 个活动,第一个活动有一个按钮来创建 第二。当我点击第二个活动的关闭按钮时,我会 喜欢它释放它的内存(或者至少让它成为垃圾 集)。目前它永远不会发布。

我一定是在这里做错了,因为 MyListActivity 从来没有 被释放。谁能告诉我我是否做错了什么 我的活动被创建/销毁的方式?或者如果我使用 ListView 错了吗?

谢谢。

我的应用作为 zip - http://www.mediafire.com/?l26o5hz2bmbwk6j

Eclipse MAT 的屏幕截图显示列表活动从未释放 内存 - www.mediafire.com/?qr6ga0k

public class MyListActivity extends ListActivity {  
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listlayout);        
    ListAdapter ada = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, GENRES);               
    setListAdapter(ada);    
}

@Override
public void onDestroy()
{                   
    super.onDestroy();
    System.gc();
}

public void ClickHandler(View target)
{
    switch (target.getId())
    {
        case R.id.LL_Btn1:
            finish();
            break;
    }
}   

private static final String[] GENRES = new String[] {
    "Action", "Adventure", "Animation", "Children", "Comedy", "Documentary", "Drama",
    "Foreign", "History", "Independent", "Romance", "Sci-Fi", "Television", "Thriller"
};} 

public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

public void ClickHandler(View target)
{
    switch (target.getId())
    {
        case R.id.M_Button01:
            Intent intent = new Intent();
            intent.setClassName(MyListActivity.class.getPackage().getName(), MyListActivity.class.getName());         
            startActivity(intent);  
            break;
    }
}}

【问题讨论】:

  • 呃...我没有下载 zip,谢谢。能发一下相关的sn-ps吗?
  • 是什么让您认为有泄漏? Android 可以让您的活动长时间运行,除非它需要内存。
  • 我确定这是内存泄漏的原因是我可以通过打开活动并关闭它来继续这样做直到我的应用程序崩溃。它不会释放内存。 Eclipse 的 MAT 工具显示出对 mContext 的依赖。
  • 在生成报告之前,您是否在 DDMS 中尝试过多次 GC?
  • 很多很多次。我很肯定这是在泄漏,但我对 android 太陌生,无法说出原因。

标签: java android listview memory-leaks listactivity


【解决方案1】:

您是否尝试过摆脱 System.gc() 并看看会发生什么?调用 System.gc() 只是告诉 VM 启动垃圾收集 - 无法保证何时完成。

【讨论】:

  • System.gc 不会导致内存泄漏。是的,它可能并不总是立即释放东西,但提示 vm 何时清理东西并没有什么坏处。
  • 我并不是说 System.gc 会导致内存泄漏,只是依靠调用它来“神奇地”解决您的内存泄漏并不是一个好习惯 :)
  • system.gc() 不在那里尝试修复泄漏,因为它是调用它的好地方。 :)
【解决方案2】:

不确定这是否会有所帮助,通常不建议这样做,但以下内容会在 onDestroy() 中杀死您的进程:

System.runFinalizersOnExit(true); android.os.Process.killProcess(android.os.Process.myPid());

把它放在 onDestroy 方法中。现在,如果从子活动(尚未测试)调用,这实际上可能会杀死您的主进程。

警告:我通常不建议这样做,因为它是一种“hacky”方式,但如果您只需要在退出时关闭您的应用程序(或活动),那么这将起作用。您仍然需要调试以找出您的应用为何保持打开状态并占用内存。

【讨论】:

    【解决方案3】:

    Eclipse MAT 是原因。新的 Android Studio 不会导致这些问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多