HandlerThread源码分析
来源:互联网 发布:免费视频编辑制作软件 编辑:程序博客网 时间:2024/06/03 19:20
HandlerThread源码分析
public class HandlerThread extends Thread { //线程优先级 int mPriority; //线程id 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() { } //创建了looper并通知getLooper。在执行getLooper之前必须先执行thread的start方法,不然getLooper将返回null,容易引发空指针 @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; } synchronized (this) { while (isAlive() && mLooper == null) { try { wait(); } catch (InterruptedException e) { } } } return mLooper; } //looper停止接收新的任务并清空MessageQueue中的任务 public boolean quit() { Looper looper = getLooper(); if (looper != null) { looper.quit(); return true; } return false; } //looper停止接收新的任务并清空MessageQueue中的延时任务,非延时任务将继续执行 public boolean quitSafely() { Looper looper = getLooper(); if (looper != null) { looper.quitSafely(); return true; } return false; } public int getThreadId() { return mTid; }}
Looper#quit相关源码
public void quit() { mQueue.quit(false); }public void quitSafely() { mQueue.quit(true);}void quit(boolean safe) { if (!mQuitAllowed) { throw new IllegalStateException("Main thread not allowed to quit."); } synchronized (this) { if (mQuitting) { return; } mQuitting = true; if (safe) { removeAllFutureMessagesLocked(); } else { removeAllMessagesLocked(); } // We can assume mPtr != 0 because mQuitting was previously false. nativeWake(mPtr); } }private void removeAllMessagesLocked() { Message p = mMessages; while (p != null) { Message n = p.next; p.recycleUnchecked(); p = n; } mMessages = null; } private void removeAllFutureMessagesLocked() { final long now = SystemClock.uptimeMillis(); Message p = mMessages; if (p != null) { if (p.when > now) { removeAllMessagesLocked(); } else { Message n; for (;;) { n = p.next; if (n == null) { return; } if (n.when > now) { break; } p = n; } p.next = null; do { p = n; n = p.next; p.recycleUnchecked(); } while (n != null); } } }
0 0
- Android HandlerThread 源码分析
- Android HandlerThread 源码分析
- Android HandlerThread 源码分析
- Android HandlerThread 源码分析
- Android HandlerThread 源码分析
- Android HandlerThread 源码分析
- android---HandlerThread源码分析
- HandlerThread源码分析
- android HandlerThread源码分析
- Android HandlerThread 源码分析
- HandlerThread源码分析
- [Android 源码分析] HandlerThread
- HandlerThread源码分析
- HandlerThread源码分析
- HandlerThread源码分析
- HandlerThread源码分析
- Android HandlerThread源码分析
- HandlerThread源码分析及使用
- Eclipse的PyDev插件安装及解决安装后找不到的问题
- 6、知乎日报 API 分析
- 3.(初级)CSS继承
- GridView里添加复选款和分页功能
- eclipse新建android工程style文件里的Theme老是报错
- HandlerThread源码分析
- java算法-另一种阶乘问题(程序优化)
- iOS之消息角标
- 整合Spring时Service层为什么不做全局包扫描详解
- 设计模式(7) ------- 适配器模式
- 最大公共子串
- C++语言--数组-6.1----数组在内存中的分布、数组名和函数、枚举常量
- 【C++】【USACO1.1.1】飞碟在这儿
- leetcode_middle_18_454. 4Sum II