2010-11-18 13 views
2

最初に、アンドロイドのGoogleグループに最初に投稿しましたが、モデレートされていて、そこに現れるまでにどのくらい時間がかかりますか分かりませんので、ここの誰かが助けてくれることを願っています。私の単純なListViewアプリケーションはメモリをリークしています。

私はネットで見つけたListActivity の例の後に、ListViewを使って簡単なアプリケーションを作成しました。

アプリには2つのアクティビティがあり、最初に 秒を作成するボタンがあります。私が2番目のアクティビティで閉じるボタンを押すと、そのメモリを解放する(または少なくともそれがゴミになることを許可する) のようになります が収集されます)。現在、それは決して解放されません。

MyListActivityは決して がリリースされるため、私はここで何か間違っている必要があります。 私の活動が作成/破壊された方法を間違っていると誰にでも教えてもらえますか?または ListViewの私の使用が間違っている場合は?

ありがとうございました。

ジップとして私のアプリ

- メモリを解放することはありませんリストの活動を示すのEclipse MATのhttp://www.mediafire.com/?l26o5hz2bmbwk6j

スクリーンショット - 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

ええと...私はジップをダウンロードしていない、ありがとう。関連するスニペットを投稿できますか? –

+1

あなたは何がリークだと思いますか? Androidは、メモリが必要な場合を除き、あなたの活動を長時間実行し続けることができます。 – dhaag23

+0

メモリリークであると確信する理由は、アプリケーションをクラッシュさせるまで、アクティビティを開いて閉じることで、これをやり続けることができるからです。メモリを解放しません。 EclipseのMATツールはmContextに依存していることを示しています。 –

答えて

0

Eclipse MATが原因でした。新しいAndroid Studioではこれらの問題は発生しません。

0

はあなたが退治しようとしたことがありSystem.gc()と何が起こるかを参照してください? System.gc()を呼び出すだけで、VMにガベージコレクションを開始するように指示するだけです。実行されるときは保証されません。これが役立つ場合

+0

System.gcはメモリリークを引き起こしません。はい、それはいつも即座に物事をリリースするとは限りませんが、物事をきれいにするときはVMにヒントを与えることはありません。 –

+0

私はSystem.gcがメモリリークを引き起こしていると言っているわけではありません。メモリリークを解決するために "魔法のように"呼び出すことに頼るのは良い習慣ではありません。 – Thira

+0

システム。gc()はそこにリークを修正しようとしていません。 :) –

0

わからない、そしてそのない、一般的にこれを行うにはお勧めしますが、以下は、あなたのonDestroyでの処理()殺す:

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

これをonDestroyメソッドに挿入します。これは子アクティビティから呼び出された場合、あなたのメインプロセスを実際に終了させる可能性があります(テストしていない)。

警告:一般的には、この方法を「ハックリ」する方法はお勧めしませんが、終了時にアプリケーション(またはアクティビティ)を閉じるだけで済みます。なぜあなたのアプリが開いていてメモリを食べているのかを調べるには、デバッグする必要があります。

関連する問題