2010-11-18 33 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方法中。如果從兒童活動中調用(沒有測試過),現在這實際上可能會殺死你的主進程。

警告:我通常不建議這樣做,因爲它是做這件事的「黑客」方式,但如果你只是需要你的應用程序(或活動)關閉退出然後這將工作。您仍然需要進行調試,以瞭解您的應用程序保持打開狀態並進食內存的原因。

相關問題