Android之用Handler實現主執行緒和子執行緒互相通訊以及子執行緒和子執行緒之間的通訊
阿新 • • 發佈:2019-02-06
1、上程式碼
activity_main.xml檔案
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.handler.MainActivity" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ParentToChile" /> <Button android:layout_below="@+id/button1" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ChileToParent" /> <Button android:layout_below="@+id/button2" android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ChileToChile" /> </RelativeLayout>
MainActivity.java檔案
package com.example.handler; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends ActionBarActivity { public static final String TAG = "HandlerTest"; public Button mButtonPtoC; public Button mButtonCtoP; public Button mButtonCtoC; public Handler mHandlerCToP = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch(msg.what) { case 0: Log.d(TAG, "mHandlerCToP msg.what is 0"); break; default: break; } } }; public Handler mHandlerPToc = null; public Handler mHandlerCtoC = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButtonPtoC = (Button)findViewById(R.id.button1); mButtonCtoP = (Button)findViewById(R.id.button2); mButtonCtoC = (Button)findViewById(R.id.button3); startChileThread("mHandlerPToc"); startChileThread("mHandlerCtoC"); mButtonPtoC.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { new Thread(new Runnable(){ @Override public void run() { mHandlerCToP.sendEmptyMessage(0); } }).start(); } }); mButtonCtoP.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { mHandlerPToc.sendEmptyMessage(0); } }); mButtonCtoC.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { new Thread(new Runnable(){ @Override public void run() { mHandlerCtoC.sendEmptyMessage(0); } }).start(); } }); } //開啟一根執行緒 public void startChileThread(final String type) { new Thread(new Runnable(){ @Override public void run() { if (Looper.myLooper() == null) { Log.d(TAG, "Looper.myLooper() is null"); Looper.prepare(); } else { Log.d(TAG, "Looper.myLooper() is not null"); } if ("mHandlerPToc".equals(type)) { mHandlerPToc = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch(msg.what) { case 0: Log.d(TAG, "mHandlerPToc msg.what is 0"); break; default: break; } } }; } else if ("mHandlerCtoC".equals(type)) { mHandlerCtoC = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch(msg.what) { case 0: Log.d(TAG, "mHandlerCtoC msg.what is 0"); break; default: break; } } }; } Looper.loop(); } }).start(); } }
3個按鈕分別是子執行緒向主執行緒發訊息、主執行緒向子執行緒發訊息、子執行緒和子執行緒發訊息
2、執行結果
控制檯列印
3、總結
後面還會講HandlerThread 實現子執行緒和子執行緒之間的通訊,然後還有講解Handler原始碼分析