HandlerThread解决的痛点以及原理分析

作用,解决痛点

handler 在子线程中使用需要的步骤:在这里附上一篇handler 原理介绍
在run方法中:

        Looper.prepare();
       // 在这里进行handler的声明以及绑定looper.
        Looper.loop();
    

handlerThread 继承自Thread,也是一个线程。 它在run方法中已经为我们写好了。 具体看一下源码:

  @Override
    public void run() {
        mTid = Process.myTid();
        Looper.prepare();
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();
        mTid = -1;
    }
    

这时候,我们只要了解handler的原理,那么。将handlerThread的looper绑定到新声明的handler身上,然后重写handleMessage方法就能对handler所send得message进行就收以及处理。

同时,在源码之中还添加了退出消息循环的方法,quit(),更加方便了handler的管理.
具体看看代码

package com.example.disignmode.handlertest;

import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;

import com.example.haodong.common.util.LogUtil;

/**
 * describe :
 * date on 2019/4/29
 * author linghailong
 * email 105354999@qq.com
 */
public class DownLoadHandlerThread extends HandlerThread  implements Handler.Callback{
    public static final int START_DOWNLOAD=0X01;
    public static final int UPDATE_UI=0X02;
    private Handler mUIHandler;

    public void setmUIHandler(Handler mUIHandler) {
        this.mUIHandler = mUIHandler;
    }

    public DownLoadHandlerThread(String name) {
        super(name);
    }

    @Override
    public boolean handleMessage(Message msg) {
        if (msg == null) {
            return false;
        }
        switch (msg.what){
            case START_DOWNLOAD:
                try {
                    LogUtil.i("current thread"+Thread.currentThread().getName());
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (mUIHandler!=null){
                    Message uiMsg=mUIHandler.obtainMessage();
                    uiMsg.what=UPDATE_UI;
                    String s ="下载完毕";
                    uiMsg.obj=s;
                    mUIHandler.sendMessage(uiMsg);
                }
                break;
        }
        return true;
    }
}


mainActivity中的例子:

package com.example.disignmode.handlertest;

import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.example.disignmode.R;
import com.example.haodong.common.util.LogUtil;

import java.lang.ref.WeakReference;

public class Handler1Activity extends AppCompatActivity {
//    MyHandler<Handler1Activity> myHandler = new MyHandler<>(Looper.getMainLooper());
    private Handler mWorkHandler, mUiHandler;
    private DownLoadHandlerThread downLoadHandlerThread;
    private TextView mTvShow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler1);
        mTvShow = findViewById(R.id.handler1_tv);

        mUiHandler = new Handler(Looper.getMainLooper()) {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case DownLoadHandlerThread.UPDATE_UI:
                        String str = (String) msg.obj;
                        LogUtil.i(Thread.currentThread().getName());
                        mTvShow.setText(str);
                        downLoadHandlerThread.quitSafely(); // 仅仅示范方法使用。
                }
            }
        };
        downLoadHandlerThread = new DownLoadHandlerThread("work thread"); // 声明thread
        downLoadHandlerThread.start(); // 和别的thread一样。需要调用start
        downLoadHandlerThread.setmUIHandler(mUiHandler); 
        mWorkHandler=new Handler(downLoadHandlerThread.getLooper(),downLoadHandlerThread); // 对工作线程绑定looper 以及handler.callback
        Message message =Message.obtain();
        message.what=DownLoadHandlerThread.START_DOWNLOAD;
        mWorkHandler.sendMessage(message); //发送消息
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值