Android:HandlerThread学习

前言

在Android中,主线程与子线程的交互,例如在子线程进行网络请求,请求后将数据更新到View上,咱们经常使用Handler或者AsyncTask。HandlerThread与它们的区别在于会建立工做线程、Hanlder和Looper。这样就不用在主线程建立Handler或者AsyncTask的硬性要求。能够说HandlerThread是Handler的应用场景。bash

HandlerThread的使用

HandlerThread继承至Thread,因此自己也是一个线程。先撸代码为敬,下面是通常例子代码。网络

HandlerThread handlerThread = new HandlerThread("handler");

        handlerThread.start();

        Handler workerHandler = new Handler(handlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //doSomething
            }
        };

        workerHandler.post(new Runnable() {
            @Override
            public void run() {
                //doSomething
            }
        });

复制代码

在HandlerThread构造方法中能够随意传入一个字符串,该字符串只用于区别不一样线程而已,方便在jstack分析或者问题定位,这里是handler。接着将HandlerThread对象的Looper对象做为Handler的参数,新建Handler对象。这样就将工做线程的Looper和Handler绑定在一块儿了,也就是工做线程和Handler绑定在一块儿了。经过Handler对象发送消息或者任务到Looper对象中的消息队列,在工做线程中处理消息或任务。ide

若是再也不使用工做线程,建议调用HandlerThread对象的quitSafely方法退出,避免不要的资源浪费。oop

源码分析

在理解了Android的消息机制以后,ThreadHandler的原理能够说很是的简单,只是Android消息机制的一个应用。源码分析

HandlerThread 的构造器

public HandlerThread(String name) {
        super(name);
        mPriority = Process.THREAD_PRIORITY_DEFAULT;
    }
    
    public HandlerThread(String name, int priority) {
        super(name);
        mPriority = priority;
    }
复制代码

HandlerThread有两个重载构造器,一个是使用线程默认优先级的构造器,一个是能够供用户本身定义线程优先权的构造器。post

HandlerThread的Run方法

在线程中,调用Thread对象的start方法,最终会run方法。而HandlerThread重写了run方法。ui

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

在run方法中,主要是建立了Looper对象,并启动循环。onLooperPrepared方法是受保护的空方法,能够经过继承HandlerThread重写该方法,在开启消息循环前作一些准备。this

若是对于Looper和Handler比较陌生,能够查看Android的消息机制spa

总结

  • Handler和AsyncTask之因此要在主线程建立实例,是由于要和主线程的Looper绑定。
  • HandlerThread经过建立独立的拥有Looper的工做线程来进行耗时任务。Looper能够能够用来建立Handler。在主线程经过Handler对象将耗时任务发送到工做线程中。
  • HandlerThread本质上只是对Android消息机制的应用,更方便开发者。知道Android消息机制原理,彻底能够实现相似的功能。

知识点分享线程

Android消息机制

IntentService必知必会

点个赞,老铁

若是以为文章有用,给文章点个赞,铁子
相关文章
相关标签/搜索