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源码分析


更多相关文章

  1. 《Android 创建线程源码与OOM分析》
  2. 重新认识Java线程的概念
  3. java线程实现与进程(二)
  4. java多线程jdk1.7与jdk1.6结果不一致的问题
  5. Java线程的生命周期和状态控制
  6. 使用线程设置后台进程以处理Android中的工作
  7. Android开发之线程与线程池
  8. Android多线程下载远程图片【转】
  9. Android学习笔记(三一):线程:Message和Runnable

随机推荐

  1. 第 5 章 MySQL 备份与恢复
  2. mysql笔记02:source命令导入大数据速度慢
  3. Mac下使用brew搭建PHP7+nginx+mysql开发
  4. shared pool原理,有AWR报告,主要是library
  5. 要查询选修了所有课程的学生信息,怎样用sq
  6. java+mysql中文乱码问题
  7. PHP执行.SQL文件的实例代码分享
  8. 通过MySQL JDBC驱动程序(连接器/J)进行负
  9. 如何用c#创建SQL Server 2012数据库?
  10. Oracle使用SQL Develop时报错