Android:HandlerThread学习

作者: GitCode8 | 来源:发表于2019-06-02 09:46 被阅读3次

    前言

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

    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构造方法中可以随意传入一个字符串,该字符串只用于区别而已,这里是handler。接着将HandlerThread对象的Looper对象作为Handler的参数,新建Handler对象。这样就将工作线程的Looper和Handler绑定在一起了,也就是工作线程和Handler绑定在一起了。通过Handler对象发送消息或者任务到Looper对象中的消息队列,在工作线程中处理消息或任务。

    如果不再使用工作线程,建议调用HandlerThread对象的quitSafely方法退出,避免不要的资源浪费。

    源码分析

    在理解了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有两个重载构造器,一个是使用线程默认优先级的构造器,一个是可以供用户自己定义线程优先权的构造器。

    HandlerThread的Run方法

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

        @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重写该方法,在开启消息循环前做一些准备。

    如果对于Looper和Handler比较陌生,可以查看Android的消息机制

    总结

    • Handler和AsyncTask之所以要在主线程创建实例,是因为要和主线程的Looper绑定。
    • HandlerThread通过创建独立的拥有Looper的工作线程来进行耗时任务。Looper可以可以用来创建Handler。在主线程通过Handler对象将耗时任务发送到工作线程中。
    • HandlerThread本质上只是对Android消息机制的应用,更方便开发者。知道Android消息机制原理,完全可以实现类似的功能。

    知识点分享

    Android消息机制

    IntentService必知必会

    如果觉得文章有用,给文章点个赞,铁子

    相关文章

      网友评论

        本文标题:Android:HandlerThread学习

        本文链接:https://www.haomeiwen.com/subject/usntxctx.html