一源葫、子 → 主線(xiàn)程通信
在主線(xiàn)程中, 實(shí)例Handler對(duì)象叼架。
1 Handler mHandler = new Handler(){
2 @Override
3 public void handleMessage(Message msg) {
4 super.handleMessage(msg);
5 switch (msg.what) {
6 case 0:
7 //do something, refresh UI …
8 break;
9 default:
10 break;
11 }
12 }
13 };
main() -> looper.loop() -> messageQueue.next() -> hander.dispatchMessage -> handler.handleMessage()
在子線(xiàn)程中造挽,發(fā)送消息給主線(xiàn)程李滴。
1 new Thread() {
2 public void run() {
3 Message message = new Message();
4 message.obj = "子線(xiàn)程發(fā)送的消息";
5 mHandler.sendMessage(message);
6 };
7 }.start();
//消息入隊(duì)列的過(guò)程
mHandler.sendMessage(msg) -> messageQueue.enqueueMessage()
handler子線(xiàn)程向主線(xiàn)程通信.png
二、子 → 子線(xiàn)程通信
在一個(gè)子線(xiàn)程中創(chuàng)建一個(gè)Handler秀睛,回調(diào)自然就在此子線(xiàn)程中,然后在另一個(gè)子線(xiàn)程中調(diào)用這個(gè)handler來(lái)發(fā)送消息。
1 new Thread(new Runnable() {
2
3 @Override
4 public void run() {
5 String msg;
6 Looper.prepare();//??
7
8 childHandler = new Handler() {
9 @Override
10 public void handleMessage(Message msg) {
11 super.handleMessage(msg);
12
13 System.out.println("這是從--->>" + msg.obj+ "過(guò)來(lái)的消息");
14 }
15 };
16 Looper.loop();//開(kāi)始輪循??
17 }
18 }).start();
然后創(chuàng)建第二個(gè)子線(xiàn)程
1 new Thread(new Runnable() {
2
3 @Override
4 public void run() {
5 Looper loop = Looper.myLooper();//??
6 Message msg = childHandler.obtainMessage();
7 msg.obj = " 子線(xiàn)程 ";
8 childHandler.sendMessage(msg);
9 }
10 }).start();
三缕坎、主 → 子線(xiàn)程通信
需要在子線(xiàn)程初始化Looper,并在主線(xiàn)程里創(chuàng)建的Handler引用子線(xiàn)程的Looper
Handler中引用哪個(gè)線(xiàn)程的Looper篡悟,就在那個(gè)線(xiàn)程里處理消息谜叹。
public class ThreadHandlerActivity extends Activity{
2 //創(chuàng)建子線(xiàn)程
3 class MyThread extends Thread{
4 private Looper looper;//取出該子線(xiàn)程的Looper
5 public void run() {
6
7 Looper.prepare();//創(chuàng)建該子線(xiàn)程的Looper
8 looper = Looper.myLooper();//取出該子線(xiàn)程的Looper
9 Looper.loop();//只要調(diào)用了該方法才能不斷循環(huán)取出消息
10 }
11 }
12
13 private Handler mHandler;//將mHandler指定輪詢(xún)的Looper
14
15 protected void onCreate(Bundle savedInstanceState) {
16 super.onCreate(savedInstanceState);
17 setContentView(R.layout.main);
18 // thread = new MyThread();
19 // thread.start();//開(kāi)啟這個(gè)線(xiàn)程
//實(shí)例化一個(gè)特殊的線(xiàn)程HandlerThread必須指定一個(gè)名字 (MyThread用不上了)
HandlerThread thread = new HandlerThread("handlerThread");
thread.start();//開(kāi)啟這個(gè)線(xiàn)程
20 //下面是主線(xiàn)程發(fā)送消息
21 mHandler = new Handler(thread.looper){//用18行,thread這里是空
22 public void handleMessage(android.os.Message msg) {
23 Log.d("當(dāng)前子線(xiàn)程是----->",Thread.currentThread()+"");
24 };
25 };
26 mHandler.sendEmptyMessage(1);
27 }
28 }
HandlerThread 創(chuàng)建處理的子線(xiàn)程里是不能重寫(xiě)Run()方法的搬葬,因HandlerMessage本身實(shí)現(xiàn)了Run()方法
看一下內(nèi)部實(shí)現(xiàn):
1 @Override
2 public void run() {
3 mTid = Process.myTid();
4 Looper.prepare();
5 synchronized (this) {
6 mLooper = Looper.myLooper();
7 notifyAll();
8 }
9 Process.setThreadPriority(mPriority);
10 onLooperPrepared();
11 Looper.loop();
12 mTid = -1;
13 }
**因自己各個(gè)項(xiàng)目穿插頻繁荷腊,為了避免忘得干干凈凈,方便自己定期翻閱急凰。