美文网首页Android
Handler学习(2)

Handler学习(2)

作者: 景山道人 | 来源:发表于2019-07-04 14:01 被阅读0次

HandlerThread

使用场景:创建一个子线程用于处理耗时操作,创建完HandlerThread后可以用getLooper将其绑定的线程传给Handler,这样该Handler再处理消息时都会运行在这个线程上,优点在于可以不断使用,避免了频繁的创建新线程,使用方法在最底下。

官方Doc API 27

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的线程,需要调用start()方法

构造方法

/**
 * Constructs a HandlerThread.
 * @param 线程名称
 * @param priority 运行Thread的优先级,值必须来自 {@link android.os.Process} 
 * 而不是Java的Thread类
 */
public HandlerThread(String name, int priority) {
    super(name);
    mPriority = priority;
}

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

关于Priority,这个和Linux系统进程的优先级相关,这里不要使用Thread类里面的优先级,要使用Android的Process类里面的,而且这里的优先级不要设置给Thread,只能设置给Process。

优先级分很多,默认是0,可以为负,值越小代表优先级越高。

方法:

  1. onLooperPrepared()
protected void onLooperPrepared() {
    ...
}

留给子类重写,用于在Looper开始loop之前做一些初始化工作

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

调用start后这里便会开始执行,在这个线程绑定一个Looper

  1. getLooper()
/**
 * 返回线程绑定的Looper,如果线程还没调用start,或者因为其他原因
 * isAlive()返回false,这个方法会返回空。如果这个线程已经start了,
 * 阻塞到Looper初始化成功为止。
 */
public Looper getLooper() {
    ...
    return mLooper;
}

用于返回这个线程绑定的Looper,用这个Looper创建绑定的Handler,操作也会执行在这个线程上

  1. getThreadHandler()
    返回线程绑定的Handler,已被隐藏,不再使用
  2. quit() 立刻退出looper,已退出返回true
  3. quitSafely() 等到剩下的消息都处理完了再退出looper,已退出返回true
public boolean quitSafely() {
    Looper looper = getLooper();
    if (looper != null) {
        looper.quitSafely();
        return true;
    }
    return false;
}

使用方法

HandlerThread handlerThread;
Handler handler;

private void initHandler() {
    handlerThread = new HandlerThread("MyThread");
    handlerThread.start();
    handler = new Handler(handlerThread.getLooper());
    handler.post(new Runnable() {
        @Override
        public void run() {
        ...
        }
    });
}

相关文章

网友评论

    本文标题:Handler学习(2)

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