1. 程式人生 > >Android之用Handler實現主執行緒和子執行緒互相通訊以及子執行緒和子執行緒之間的通訊

Android之用Handler實現主執行緒和子執行緒互相通訊以及子執行緒和子執行緒之間的通訊

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原始碼分析