HandlerThread解析

HandlerThread是一种具有消息循环的线程。HandlerThread可以接收消息并处理消息,并执行一些耗时操作,这样UI线程就可以把一些耗时的操作命令发送给HandlerThread,由该线程处理后再发送到主线程返回。这样主线程用于分发和显示,而子线程用于逻辑处理和运算。

HandlerThread使用的样例:

package com.fxb.handlerthead;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements View.OnClickListener{

    private static final String TAG = "HandlerThreadTest";
    private static final int WHAT_CALUCULATE = 0x1001;
    private static final int WHAT_RESULT = 0x1002;

    private TextView tvShow;
    private Button btnStart;
    private HandlerThread handlerThread;
    private Handler mainHandler, subHandler;
    private int count;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

        mainHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
            }
        };
        initThread();
    }

    private void initView(){
        tvShow = (TextView)findViewById(R.id.tvShow);
        btnStart = (Button)findViewById(R.id.btnStart);

        btnStart.setOnClickListener(this);
    }

    private void initThread(){
        handlerThread = new HandlerThread("myHandlerThread");
        handlerThread.start();

        subHandler = new Handler(handlerThread.getLooper()){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if(msg.what == WHAT_CALUCULATE){
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    final int num1 = msg.arg1;
                    final int num2 = msg.arg2;
                    final int result = num1 + num2;
                    mainHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            tvShow.setText(num1+" + "+num2+" = "+result);
                        }
                    });
                }
            }
        };
    }

    @Override
    public void onClick(View v) {
        if(v == btnStart){
            mainHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    count++;
                    Message msg = subHandler.obtainMessage(WHAT_CALUCULATE, count, count + 1);
                    msg.sendToTarget();

                    mainHandler.postDelayed(this, 1000);
                }
            }, 1000);
        }
    }
}

当点击Start按钮后,延时500ms后会在tvShow上显示1 + 2 = 3,1s后显示2 + 3 = 5,依次递增。

HandlerThread源码

import android.os.Looper;

public class HandlerThread extends Thread {
    int mPriority;
    int mTid = -1;
    Looper mLooper;

    public HandlerThread(String name) {
        super(name);
        mPriority = Process.THREAD_PRIORITY_DEFAULT;
    }

    public HandlerThread(String name, int priority) {
        super(name);
        mPriority = priority;
    }

    protected void onLooperPrepared() {
    }

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

    public Looper getLooper() {
        if (!isAlive()) {
            return null;
        }

        // If the thread has been started, wait until the looper has been created.
        synchronized (this) {
            while (isAlive() && mLooper == null) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }
        }
        return mLooper;
    }

    public boolean quit() {
        Looper looper = getLooper();
        if (looper != null) {
            looper.quit();
            return true;
        }
        return false;
    }

    public boolean quitSafely() {
        Looper looper = getLooper();
        if (looper != null) {
            looper.quitSafely();
            return true;
        }
        return false;
    }

    public int getThreadId() {
        return mTid;
    }
}

getLooper()时,如果没有创建好,则会阻塞,创建好后会唤醒,然后返回。

时间: 2024-08-25 23:33:54

HandlerThread解析的相关文章

handler looper和messageQueue

一.使用方法. Looper用来处理消息循环,在创建过程中会初始化MessageQueue. Handler在其它线程发消息给当前线程 MessageQueue用来存放消息 Looper对象在哪个线程创建,Handler的handleMessage方法就在哪个线程执行 在创建activity时,android系统本身会为activity创建Looper. final Handler mainHandler = new Handler(getMainLooper()) { @Override pu

Android源代码解析之(四)-->HandlerThread

转载请标明出处:一片枫叶的专栏 上一篇文章中我们解说了AsyncTast的基本使用以及实现原理,我们知道AsyncTask内部是通过线程池和Handler实现的.通过对线程池和handler的封装实现了对异步任务操作.很多其它关于AsyncTask相关的内容,可參考我的android源代码解析之(三)–>异步任务AsyncTask 本文我们将解说HandlerThread相关的概念. HandlerThread是什么东西呢?了解一个类最好的方法就是查看类的定义,所以我们就看一下HandlerTh

Android培训HandlerThread的使用及源码解析

Android培训HandlerThread的使用及源码解析-北京尚学堂 关于Hanlder的基本使用可以参见博文<Android中Handler的使用>,如果想了解Handler.Looper.Thread等的相互关系以及内部实现原理可以参见博文<深入源码解析Android中的Handler,Message,MessageQueue,Looper>. Android中的API中对HandlerThread的描述是: Handy class for starting a new t

【Android】IntentService &amp; HandlerThread源码解析

一.前言 在学习Service的时候,我们一定会知道IntentService:官方文档不止一次强调,Service本身是运行在主线程中的(详见:[Android]Service),而主线程中是不适合进行耗时任务的,因而官方文档叮嘱我们一定要在Service中另开线程进行耗时任务处理.IntentService正是为这个目的而诞生的一个优雅设计,让程序员不用再管理线程的开启和允许. 至于介绍HandlerThread,一方面是因为IntentService的实现中使用到了HandlerThrea

Android HandlerThread 完全解析

想想已经理解的Handler异步处理流程,你就很容易理解HandlerThread. 在你看原文之前,我给你捋一捋思路,方便你理解鸿洋前辈的文章. A线程要发消息给B线程,那么B线程必须持有A线程的Handler,之后在B线程中发消息发消息给A线程,B线程中处理消息(收发分别在俩线程中进行,加上MessageQueue正好构成异步通信),队列在A线程中(Looper对象也在A线程中,什么looper.prepare()以及looper.loop()当然也在A线程中) 到了HandlerThrea

Android中HandlerThread的使用及原理解析

关于Hanlder的基本使用可以参见博文<Android中Handler的使用>,如果想了解Handler.Looper.Thread等的相互关系以及内部实现原理可以参见博文<深入源码解析Android中的Handler,Message,MessageQueue,Looper>. Android中的API中对HandlerThread的描述是: Handy class for starting a new thread that has a looper. The looper c

HandlerThread 的使用及其源码完全解析

本篇我们将来给大家介绍HandlerThread这个类,以前我们在使用线程执行一个耗时任务时总会new一个Thread的线程去跑,当任务执行完后,线程就会自动被销毁掉,如果又由新的任务,我们又得新建线程.....我们假设这样的一个情景,我们通过listview去加载图文列表,当我们往下滑动时,这时需要不断去请求网络资源,也就是需要不断开线程去加载网络资源,如果每次都new一个Thread,这显然是不合理的,那么该怎么办呢?相信大家都应该用过图片加载框架ImageLoader,其实ImageLoa

HandlerThread 特点和北京pk10源码搭建解析

HandlerThread北京pk10源码网站搭建解析 因为源码很简短,这里就全部粘贴过来了. /** Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.*/public class HandlerThread extends Thread {in

android源码解析之(三)--&gt;HandlerThread

HandlerThread是个什么东西?查看类的定义时有这样一段话: Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called. 意思就是说:这个类的作用是创建一个包含looper的线程. 那么我们在什么时候需要用到它呢?加入在应用程序当中为了实现同时完成