0

ハンドラーがAndroidのメモリをリークする可能性があることは理解していますが、私が行ったことが正しいかどうかはよくわかりません。

public class MyActivity extends Activity
{

Handler handler;
HashMap<String, String> bigData = new HashMap<String, String>();

protected void onCreate(undle savedInstanceState) {
    super.onCreate(savedInstanceState);
    handler = new WeakHandler(){
        public void handlerMessage(Message msg, Context conetxt)
        {
           // i think this usage is wrong, still leak, am I right?
           Log.v("MyActivity", bigData.get("abc"))
        }
    }
};


static class WeakHandler extends Handler {

    private final WeakReference<Context> ref;

    public WeakHandler(Context t) {
        super();
        ref = new WeakReference<Context>(t);
    }

    @Override
    public final void handleMessage(Message msg) {
        final Context context = ref.get();
        if (context != null) {
            handleMessage(msg, context);
        }
    }

    public void handlerMessage(Message msg, Context conetxt)
    {

    }

 }

また、ハンドラーを使用して「post」、「postDelayed」、「removeCallbacks」を実行したい場合は、handleMessageを気にせず、次のように、新しいHandlerインスタンスを作成するだけで安全です。

new Handler().postDelayed(some Runnable);
4

2 に答える 2

1

WeakHandlerをインスタンス化すると、実際のWeakHandlerクラスではなく、WeakHandlerクラスを拡張する匿名クラスになります。匿名クラスは静的になることはないため、明示的なWeakReferenceに加えて、含まれているクラス(つまり、MyActivity)への暗黙的な参照があります。

onCreate()はメインスレッドで実行されるため、onCreate()内で作成されるハンドラーはメイントレッド(実際には、アプリケーションの起動時に作成されるメインルーパー)に関連付けられます。メッセージ(またはランナブルはメッセージでラップアラウンドされるため、ランナブル)をハンドラーに投稿すると、そのメッセージ/ランナブルはハンドラーへの参照を持ちます。

したがって、postDelayedで5分の遅延が発生したとします。アクティビティを破棄した後(たとえば、ローテーションのため)、メインルーパーはメッセージ/ランナブルへの参照を持ち、メッセージ/ランナブルはハンドラーへの参照を持ち、ハンドラーは5分間アクティビティへの参照を持ちます。これはリークです。

はい、「Log.v( "MyActivity"、bigData.get( "abc"))」行もアクティビティをリークします。

于 2013-10-24T18:08:46.937 に答える
0

MATアナライザーを使用して、メモリリークをチェックします。http://www.youtube.com/watch?v=_CruQY55HOk。話はメモリリークについてです。

私の推測では、コンテキストへの参照がリークを引き起こしています。getApplicationContext();を使用します。

このコンテキストは、アプリケーションが存続している限り存続します。

http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html

于 2013-03-26T06:40:46.383 に答える