2010-11-18 24 views
2

首先,我确实发布了这个android谷歌组,但它的主持人,我不知道需要多长时间来显示那里,所以希望有人在这里可以帮助。我的简单ListView应用程序正在泄漏内存。我做错了什么?

我创建了一个简单的应用程序,并在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; 
    } 
}} 
+1

呃......我没有下载邮编,谢谢。你能发布相关的片段吗? – 2010-11-18 18:49:46

+1

是什么让你觉得有泄漏? Android可以让你的活动长时间运行,除非它需要内存。 – dhaag23 2010-11-18 19:12:37

+0

确定它是内存泄漏的原因是,我可以继续这样做,直到我的应用程序崩溃,通过打开活动并关闭它。它不会释放内存。 Eclipse的MAT工具显示了对mContext的依赖。 – 2010-11-18 23:13:12

回答

0

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

0

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

+0

System.gc不会导致内存泄漏。是的,它可能不会立即释放东西,但它不会提示虚拟机什么时候清理东西。 – 2010-11-19 05:14:54

+0

我不是说System.gc导致内存泄漏,只是它不是很好的做法,依靠称它为“神奇”似乎可以解决你的内存泄漏:) – Thira 2010-11-28 23:46:03

+0

系统。gc()不在那里试图修复泄漏,因为它是一个称为它的好地方。 :) – 2010-11-29 17:10:32

0

不知道这会帮助,它通常不推荐这样做,但下面会杀死你在的onDestroy()过程:

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

把这个放在onDestroy方法中。如果从儿童活动中调用(没有测试过),现在这实际上可能会杀死你的主进程。

警告:我通常不建议这样做,因为它是做这件事的“黑客”方式,但如果你只是需要你的应用程序(或活动)关闭退出然后这将工作。您仍然需要进行调试,以了解您的应用程序保持打开状态并进食内存的原因。

相关问题