1

私のアプリケーションには、UIを更新するためのスレッドと対応するハンドラーがあります。このスレッドは私のメインアクティビティから開始され、スレッドはコンテキストを含むいくつかのパラメーターを取ります。このコンテキストは次のように使用されます。

Context c;
MessageHandler handler;

public BluetoothCommunicator(Context c) {
   this.c = c;
   handler = new MessageHandler(c);
}

私のrun()メソッドでは、特別なイベントが発生したときに、このハンドラーにデータを投稿します。私のhandleMessage()方法では、操作が進行中であることをユーザーに通知するために、いくつかのProgressDialogを作成します。

@Override
    public void handleMessage(Message m) {

        String message = (String) m.obj;

        //Getting files
        if (message.equals("0")) {

            folder.appendToLogFile(new Date().toString(), "Incoming File From: " + deviceName); 

            pd = new ProgressDialog(c);
            pd.setTitle("Please Wait..");
            pd.setMessage("Retrieving file from " + deviceName);
            pd.setCancelable(false);

            pd.show();
        }

私が理解しているように、でProgressDialogを作成することはできませんがgetApplicationContext()、が必要Activity Contextです。

MATによると、これをコーディングした方法では、アプリケーションでメモリリークが発生します。

ここに画像の説明を入力してください

このトレースを見ると、コンストラクターで初期化しcたオブジェクトに対応していることがわかります。cこれは正しいですか?

この問題を回避するにはどうすればよいですか?問題はにあるため、AsyncTaskは関係ありませんContext

4

3 に答える 3

3

スレッドが終了したら(つまり、run()メソッドが完了したら)、変数cをnullに設定します。それはあなたのメモリリークの世話をする必要があります。

于 2012-12-04T09:49:50.113 に答える
2

オブジェクトを使用して、単純参照の代わりにアクティビティのWeakReference<Context>弱参照を格納することもできます。Contextこれにより、GCがアクティビティを「収集」できるようになり、メモリリークが発生しなくなります。

于 2012-12-04T10:02:16.970 に答える
1

デビッドの答えはあなたの問題を解決します、あなたはまた試すことができます:

進行状況ダイアログを表示するハンドラーからダミーアクティビティを開始します(進行中ダイアログに表示するレイアウトとしてカスタムダイアログを使用して実行できsetContentView()ます。また、このダミーアクティビティのテーマをとして設定しますandroid:style/Theme.Dialog)。また、進行状況ダイアログが終了するか、ユーザーがキャンセルを押した後、このダミーアクティビティも終了します。

于 2012-12-04T09:54:54.267 に答える