2013-04-24 1 views
12

mainUI 스레드에서 생성 된 핸들러를 Activity에서 전달하고 일부 네트워크 작업을 수행하는 스레드로 전달하고 결과를 얻을 때 핸들러를 사용하여 결과를 다시 보냅니다. . Inner ClassHandler Memory Leak
Android DevelopersonDestroy()가 호출 된 후에도 활성 인스턴스가 여전히 존재합니다.


그래서 내가 WeakReference을 구현했으며, WeakReference를 사용하여 활동 인스턴스를 유지 : 난이 링크를 통해 갈 때

이 방법은 메모리 누수의 문제가 있었다. 하지만 활동이 파괴 된 후에도 여전히 Activity 인스턴스가 살아있는 것을보고 있습니다.

액티비티 안에 Handler을 생성하고 액티비티 인스턴스를 핸들러에 weakreference로 전달했습니다.
Handler이 10 초 후에 전달 된 메시지로 응답하면 Activity이 파괴됩니다. 그러나 약한 참조는 여전히 Activity 인스턴스를 가지고 있으며 Activity이 파괴 된 후에 Toast이 표시됩니다.

내 이해가 잘못 된 부분이 있습니까?
누군가 핸들러에 전달 된 메시지를 처리하는 방법을 설명 할 수 있습니까?하지만 UI가 주위에 없습니까? 얻은 응답을 바탕으로

import java.lang.ref.WeakReference; import android.os.Handler; import android.os.Message; public abstract class SingleParamHandler <T> extends Handler { private WeakReference<T> mActivityReference; public SingleParamHandler(T activity) { mActivityReference = new WeakReference<T>(activity); } @Override public void handleMessage(Message msg) { if (mActivityReference.get() == null) { return; } handleMessage(mActivityReference.get(), msg); } protected abstract void handleMessage(T activity, Message msg); } import android.app.Activity; import android.os.Bundle; import android.os.Message; import android.widget.Toast; public class MainActivity extends Activity { MyHandler<MainActivity> handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main1); handler = new MyHandler<MainActivity>(this); new Thread(new MyRunnable(handler)).start(); } public void onDestroy() { super.onDestroy(); System.out.println("######## Activity onDestroy() ###### "); } private class MyRunnable implements Runnable { private Handler mHandler; public MyRunnable(Handler handler) { mHandler = handler; } public void run() { try { Thread.sleep(10000); mHandler.sendMessage(Message.obtain(handler, 1)); } catch (Exception e) { e.printStackTrace(); } } } private static class MyHandler<T> extends SingleParamHandler<T> { public MyHandler(T activity) { super(activity); } @Override public void handleMessage(T act, Message msg) { if(msg.what == 1) { Toast.makeText((MainActivity)act, "Called after activity destroyed", Toast.LENGTH_LONG).show();; } } } } 

, 내가 여기에 답을 갱신하고있다. 당신이 좋아하는 방식으로 그것을 할 수 있습니다. 그러나 이것은 하나의 방법입니다.

추가 된 활동들의 OnDestroy

public void clear() { 
    mActivityReference.clear(); 
} 

SingleParamHandler

에서 그리고의 아래() 함수가 그렇게 필요하지 않다면 안드로이드 정말 메모리에서 개체를 삭제 것이라는 보장은 없습니다

public void onDestroy() { 
    super.onDestroy(); 
    System.out.println("######## Activity onDestroy() ###### "); 
    handler.clear(); 
} 

답변

관련 문제