Handler优化与使用

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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值