我的Simple ListView应用程序正在泄漏内存。我做错了什么?

时间:2010-11-18 18:45:39

标签: java android listview memory-leaks listactivity

首先,我确实将这个帖子发布到Android谷歌小组,但是它已经过主持,我不知道在那里出现需要多长时间,所以希望有人可以提供帮助。

我使用ListActivity之后的ListView创建了一个简单的应用程序 我在网上找到的例子。

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

我必须在这里做错事,因为MyListActivity永远不会 得到释放。任何人都可以告诉我,如果我做错了什么 我的活动创建/销毁的方式?或者如果我使用的话 ListView错了吗?

感谢。

我的应用为拉链 - 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;
    }
}}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

警告:我一般不建议这样做是一种“黑客”方式,但如果你只需要你的应用程序(或活动)在退出时关闭,那么这将有效。您仍然需要进行调试,以找出您的应用保持开放和吃内存的原因。

答案 2 :(得分:0)

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