Android之HandlerThread

本文深入解析了HandlerThread的工作原理,展示了如何利用HandlerThread将消息处理从主线程转移至子线程,减轻主线程负担,实现更流畅的界面显示。通过实例代码,详细说明了HandlerThread的创建、启动及消息处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.HandlerThread是一个Thread,是Google为提高开发者效率封装的一个类。
与普通的Thread不同的是,它有一个成员属性 Looper,也就是说,我们的HandlerThread具有了Looper的功能。 

public class HandlerThread extends Thread {


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

它在内部调用了looper的prepare和loop方法;

使用HandlerThread,我们就可以在初始化Handler的时候,将HandlerThread里的Looper传递给Handler。这样,主线程里Handler消息处理就会被转移到子线程里,这样一定程度上减少了主线程的压力。

2.使用

public class HandleActivity extends AppCompatActivity {
    public static final int MSG_CODE = 0;
    public static final int MSG_CODE2 = 1;
    public static final String TAG = "HandleActivity";
    private TextView tv;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = findViewById(R.id.tv1);

        HandlerThread handlerThread = new HandlerThread("ysl");
        handlerThread.start();
        Handler mHandler = new Handler(handlerThread.getLooper()){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what){
                    case 0:
                        Log.e("handlerThread子线程Name:", Thread.currentThread().getId()+"="+Thread.currentThread().getName());
                        break;
                }
            }
        };
        mHandler.sendEmptyMessage(0);
        Log.e("handlerThread主线程Name:", Thread.currentThread().getId()+"="+Thread.currentThread().getName());
    }
}

可以看到我们new了一个handlerthread对象,并接着调用了start方法;也就是thread的start方法,会执行里面的run方法;进而进行looper的一系列操作。

然后new了一个handler对象,并把handler thread的looper传了过去。那么这个handler就是使用了子线程的looper的handler,也就是可以处理接收并处理子线程的消息了。

2019-03-12 11:49:42.929 30147-30147/com.ysl.myandroidbaseserver E/handlerThread主线程Name:: 2=main
2019-03-12 11:49:42.929 30147-30182/com.ysl.myandroidbaseserver E/handlerThread子线程Name:: 3244=ysl

可以看到日志,发送消息在主线程,接收并处理消息在子线程。

  1. HandlerThread将Looper转移到子线程中处理,降低主线程的压力,不会阻塞主线程,界面显示会更流畅
  2. 子线程处理消息,因此可以处理一些比较耗时的单个任务。
  3. 由于使用消息队列的处理方式,故并发的多任务并不适用HandlerThread,会造成严重的阻塞

参考:https://www.jianshu.com/p/7e47be62f6e8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值