国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Android HandlerThread案例詳解

瀏覽:3日期:2023-12-11 11:33:52

HandlerThread 顧名思義就是一種可以使用 Handler 的 Thread。日常開發中我們經常會通過創建一個 Thread 去執行任務,有多個任務就多創建幾個線程實現,這時候可能出現線程同步的問題。不過有時候我們并不需要很強的并發性,只需保證按照順序地執行各個任務即可,有什么好辦法實現呢?第一反應想到的可能是通過 Executors.newSingleThreadExecutor() 方法來創建一個 SingleThreadExecutor,來統一所有的任務到一個線程中,然后按順序執行。其實,除了這個方法之外,HandlerThread 也可以實現。

簡單使用

首先創建一個 HandlerThreadActivity

public class HandlerThreadActivity extends BaseActivity {private static final String TAG = 'HandlerThreadActivity'; private Button mStartBtn; private Handler mHandler; private HandlerThread mHandlerThread; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler_thread);mStartBtn = findViewById(R.id.start_btn);mHandlerThread = new HandlerThread('THREAD_NAME');mHandlerThread.start();mHandler = new Handler(mHandlerThread.getLooper());mStartBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {mHandler.post(new Runnable() { @Override public void run() {Log.d(TAG, Thread.currentThread().getId() + ' ' + String.valueOf((Looper.myLooper() == Looper.getMainLooper())) + ' 任務:' + this.hashCode());SystemClock.sleep(3000); }}); }}); } @Override protected void onDestroy() {super.onDestroy();mHandlerThread.quit(); }}

快速三擊按鈕,打印日志如下:

Android HandlerThread案例詳解

可以發現,三次不同的任務按開始的順序執行,而且是運行在子線程中,那到底是怎么實現的呢?

源碼解析

public class HandlerThread extends Thread { int mPriority; int mTid = -1; Looper mLooper; private @Nullable Handler mHandler; 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() {// 獲取線程 idmTid = Process.myTid();//構建一個 LooperLooper.prepare();synchronized (this) { mLooper = Looper.myLooper(); notifyAll();}//設置線程優先級Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop();// Looper 循環mTid = -1; } // 獲取當前線程的 Looper, public Looper getLooper() {if (!isAlive()) { return null;} synchronized (this) { while (isAlive() && mLooper == null) {try { wait();} catch (InterruptedException e) {} }}return mLooper; } /** * @return a shared {@link Handler} associated with this thread * @hide 方法隱藏掉,無法調用 */ @NonNull public Handler getThreadHandler() {if (mHandler == null) { mHandler = new Handler(getLooper());}return mHandler; } //線程退出方法,主要是調用 Looper.quit() 方法,不然一直在循環 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; }}

通讀下來,如果熟悉 Handler 原理的同學大概就明白 HandlerThread 的機制了:

HandlerThread 運行 start() 方法,回調 run() 方法。 在 run() 方法中通過 Looper.prepare() 來創建消息隊列,并通過 Looper.looper() 方法來開啟消息循環。 由于 Loop.loop() 是一個死循環,導致 run() 也是無線循環,因此當我們不需要使用 HandlerThread 的時候,要調用它的 quit() 方法或者 quiteSafely() 方法。

到此這篇關于Android HandlerThread案例詳解的文章就介紹到這了,更多相關Android HandlerThread內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 亚洲成人在线视频播放 | 亚洲欧洲小视频 | 久久久一区二区三区不卡 | 精品视频一区在线观看 | 日本乱人伦片中文字幕三区 | 99精品视频在线观看免费播放 | 欧美zoofilia杂交videos | 精品久久久久久中文字幕 | 国产精品变态重口在线 | 日本妞xxxxxxxxx69 | 欧美午夜视频一区二区三区 | 不卡午夜视频 | 精品一区二区三区中文字幕 | 国产亚洲自在精品久久 | 久久女厕一次看个够 | 亚洲欧美一区二区久久 | 欧美久在线观看在线观看 | 亚洲一级理论片 | 毛片网站在线看 | 好看的亚洲视频 | 激情欧美一区二区三区 | 国产精品日韩欧美一区二区三区 | 国产成人91精品 | 精品国产一区二区三区在线 | 精品国产欧美一区二区最新 | 日产国产精品久久久久久 | 久久99亚洲精品久久频 | 老司机亚洲精品 | 国产精品欧美韩国日本久久 | 男人的天堂在线免费视频 | 久久精品精品 | 午夜视频在线观看一区 | 国产特黄1级毛片 | 欧美三级成版人版在线观看 | 国模午夜写真福利视频在线 | 国产精品视频九九九 | 日韩中文字幕精品一区在线 | 太平公主三级dvd | 日本黄区| 国产精品99久久久久久宅男 | 男女免费观看视频 |