1.封装持有Context弱引用的Handler抽象类MyHandler.java
2.在Activity中编写MyHandler的子类,声明为静态内部类,静态内部类对外部类不持有对象引用
3.在Activity的onDestory()方法中清除
封装抽象Handler类
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import java.lang.ref.WeakReference;
public abstract class MyHandler<T> extends Handler {
private WeakReference<T> target;
public MyHandler(T view) {
this.target = new WeakReference<>(view);
}
@Override
public void handleMessage(Message msg) {
Context myTarget = (Context) target.get();
if (myTarget != null){
this.handleMessage(myTarget,msg);
}
}
protected abstract void handleMessage(Context context,Message msg);
}
在Activity中应用和清除
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import retrofit2.Retrofit;
public class HandlerInActivity extends AppCompatActivity {
WeakRefHandler weakRefHandler;
WorkThread workThread;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
weakRefHandler = new WeakRefHandler(this);
workThread = new WorkThread();
workThread.start();
}
private class WorkThread extends Thread{
@Override
public void run() {
super.run();
//耗时操作
//****
//从全局池中返回一个message实例,避免多次创建(如new Message())
Message msg = Message.obtain();
msg.obj = "aaa";
msg.what = 1;
weakRefHandler.sendMessage(msg);
}
}
/**
* 为避免内存泄漏,使用内部静态类,对外部类不保持对象引用
* 但handler需要与Activity通信,所以需要增加一个对Activity的弱引用
*/
private static class WeakRefHandler extends MyHandler<HandlerInActivity>{
public WeakRefHandler(HandlerInActivity view) {
super(view);
}
@Override
protected void handleMessage(Context context, Message msg) {
switch (msg.what){
//判断情况,进行UI操作
case 1:
Toast.makeText(context,"UI线程中获取的Msg" + msg.obj.toString(),Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
@Override
protected void onDestroy() {
//避免Activity销毁时,MessageQueue中的消息未处理完,故此时应把对应的message清出队列
weakRefHandler.removeCallbacks(workThread);//清除runnable对应的message
weakRefHandler.removeMessages(1); //清除what对应的message
super.onDestroy();
}
}