1、上代码
activity_main.xml文件
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" >
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ParentToChile" />
android:layout_below="@+id/button1"
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ChileToParent" />
android:layout_below="@+id/button2"
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ChileToChile" />
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源码分析