HandlerThread
? ? 1、Android中Handler的使用,一般都在UI主線程中執(zhí)行,因此在Handler接收消息后,處理消息時,不能做一些很耗時的操作,否則將出現(xiàn)ANR錯誤。
? ?2、HandlerThread繼承于Thread,所以它本質(zhì)就是個Thread。(本身是一個線程)
? ?3、與普通Thread的差別就在于,主要的作用是建立了一個線程,并且創(chuàng)立了消息隊列,有自己的looper,可以讓我們在自己的線程中分發(fā)和處理消息。
二、注意
? ? 1、Handler的處理過程運行在創(chuàng)建Handler的線程里
? ? 2、一個線程對應(yīng)一個Looper,一個Looper對應(yīng)一個MessageQueue,一個Looper可以對應(yīng)多個Handler。
? ? 3、handler應(yīng)該由處理消息的線程創(chuàng)建。
? ? 4、handler與創(chuàng)建它的線程相關(guān)聯(lián),而且也只與創(chuàng)建它的線程相關(guān)聯(lián)。handler運行在創(chuàng)建它的線程中,所以,如果在handler中進行耗時的操作,會阻塞創(chuàng)建它的線程。
?? ??5、Looper.myLooper(); ? ? ? ?//獲得當(dāng)前的Looper
?
? ? ? ? Looper.getMainLooper() ? //獲得UI線程的Lopper
? ? ?6、Handle的初始化函數(shù)(構(gòu)造函數(shù)),如果沒有參數(shù),那么他就默認使用的是當(dāng)前的Looper,如果有Looper參數(shù),就是用對應(yīng)的線程的Looper。
? ? ?7、如果一個線程中調(diào)用Looper.prepare(),那么系統(tǒng)就會自動的為該線程建立一個消息隊列,然后調(diào)用Looper.loop();之后就進入了消息循環(huán),這個之后就可以發(fā)消息、取消息、和處理消息。
?
三、什么是HandlerThread
? ? ? ??Android的線程分為有消息循環(huán)的線程和沒有消息循環(huán)的線程,有消息循環(huán)的線程一般都會有一個Looper。事實上Android提供了一個封裝好的帶有l(wèi)ooper的線程類,即為HandlerThread
?
四、實例1
1 package app.com.myapplication; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.HandlerThread; 7 import android.os.Looper; 8 import android.os.Message; 9 import android.widget.Toast; 10 11 /** 12 * Created by ${zyj} on 2016/2/15. 13 * 14 */ 15 public class HandlerThreadActivity extends Activity { 16 17 private HandlerThread handlerThread ; 18 private Handler handler; 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 24 // 1:創(chuàng)建一個HandlerThread,即創(chuàng)建了一個包含Looper的線程。 25 handlerThread = new HandlerThread("leochin.com"); 26 handlerThread.start(); //創(chuàng)建HandlerThread后一定要記得start() 27 28 //2:獲取HandlerThread的Looper 29 Looper looper = handlerThread.getLooper(); 30 31 //3:創(chuàng)建Handler,通過Looper初始化 32 handler = new Handler(looper) { 33 34 @Override 35 public void handleMessage(Message msg) { 36 super.handleMessage(msg); 37 int what = msg.what; 38 Toast.makeText(HandlerThreadActivity.this, "hahah" + what , Toast.LENGTH_SHORT).show(); 39 } 40 }; 41 42 //通過以上三步我們就成功創(chuàng)建HandlerThread。通過handler發(fā)送消息,就會在子線程中執(zhí)行。 43 //如果想讓HandlerThread退出,則需要調(diào)用handlerThread.quit();。 44 45 //創(chuàng)建一個線程發(fā)送消息 46 new ChildThread().start(); 47 } 48 49 class ChildThread extends Thread { 50 @Override 51 public void run() { 52 super.run(); 53 try { 54 //在子線程中可以做一些耗時的工作 55 sleep( 1000 ); 56 Message message = handler.obtainMessage(); 57 message.what = 3 ; 58 handler.sendMessage(message); 59 }catch ( Exception e ){ 60 61 } 62 } 63 } 64 }?
實例2
1 package app.com.myapplication; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.HandlerThread; 7 import android.os.Looper; 8 import android.os.Message; 9 import android.widget.Toast; 10 11 /** 12 * Created by ${zyj} on 2016/2/15. 13 * HandlerThread繼承于Thread,所以它本質(zhì)就是個Thread。 14 * 與普通Thread的差別就在于,主要的作用是建立了一個線程,并且創(chuàng)立了消息隊列,有來自己的looper,可以讓我們在自己的線程中分發(fā)和處理消息。 15 */ 16 public class HandlerThreadActivity2 extends Activity { 17 18 19 private MHandlerThread mHandlerThread ; 20 private Handler handler ; 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 26 // 1:創(chuàng)建一個HandlerThread,即創(chuàng)建了一個包含Looper的線程。 27 mHandlerThread = new MHandlerThread( "thisName" ) ; 28 mHandlerThread.start(); //創(chuàng)建HandlerThread后一定要記得start() 29 30 //2:獲取HandlerThread的Looper 31 Looper looper = mHandlerThread.getLooper(); 32 33 //3:創(chuàng)建Handler,通過Looper初始化 34 //特別要注意的是handler與誰相關(guān),不是看handler寫在什么位置,而是看handler的looper跟什么相關(guān) 35 handler = new Handler(looper) { 36 37 @Override 38 public void handleMessage(Message msg) { 39 super.handleMessage(msg); 40 int what = msg.what; 41 Toast.makeText(HandlerThreadActivity2.this, "hahah" + what , Toast.LENGTH_SHORT).show(); 42 } 43 }; 44 45 handler.sendEmptyMessage(2) ; 46 47 } 48 49 class MHandlerThread extends HandlerThread { 50 public MHandlerThread(String name) { 51 super(name); 52 } 53 } 54 }?
注意:寫?MHandlerThread 的時候,最好寫上線程的優(yōu)選級
1 class MHandlerThread extends HandlerThread { 2 public MHandlerThread(String name ) { 3 //設(shè)置程序的優(yōu)先級(標準后臺程序) 4 super(name , Process.THREAD_PRIORITY_BACKGROUND); 5 } 6 }?
總結(jié)
以上是生活随笔為你收集整理的HandlerThread的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android studio .giti
- 下一篇: Android线程优先级设置方法技巧