Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息

简介: MainActivity如下:package cc.c;import android.app.Activity;import android.

MainActivity如下:

package cc.c;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.TextView;
/**
 * Demo描述:
 * 
 * 示例步骤如下:
 * 1 子线程给子线程本身发送消息
 * 2 收到1的消息后,子线程给主线程发送消息
 * 3 收到2的消息后,主线程给子线程发送消息
 * 
 * 为实现子线程给自己本身发送消息,关键还是在于构造Handler时传入的Looper.
 * 在此就传入该子线程自己的Looper即调用Looper.myLooper(),代码如下:
 * Looper.prepare();
 * mHandlerTest1=new HandlerTest1(Looper.myLooper());
 * Looper.loop();
 * 
 * 所以当mHandlerTest1.sendMessage(message);发送消息时
 * 当然是发送到了它自己的消息队列.
 * 
 * 当子线程中收到自己发送的消息后,可继续发送消息到主线程.此时只要注意构造
 * Handler时传入的Handler是主线程的Handler即可,即getMainLooper().
 * 其余没啥可说的.
 * 
 * 
 * 在主线程处理消息后再发消息到子线程
 * 
 * 
 * 其实这些线程间发送消息,没有什么;关键还是在于构造Handler时传入谁的Looper.
 *
 */
public class MainActivity extends Activity {
	private TextView mTextView;
	private HandlerTest1 mHandlerTest1;
	private HandlerTest2 mHandlerTest2;
	private int counter=0;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}

	private void init() {
		mTextView = (TextView) findViewById(R.id.textView);
		
		//1 子线程发送消息给本身
		new Thread() {
			public void run() {
				Looper.prepare();
				mHandlerTest1=new HandlerTest1(Looper.myLooper());
				Message message = new Message();
				message.obj = "子线程发送的消息Hi~Hi";
				mHandlerTest1.sendMessage(message);
				Looper.loop();
			};
		}.start();
		
	}

	private class HandlerTest1 extends Handler {

		private HandlerTest1(Looper looper) {
			super(looper);
		}

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			System.out.println("子线程收到:" + msg.obj);
			
			//2  收到消息后可再发消息到主线程
			mHandlerTest2=new HandlerTest2(getMainLooper());
			Message message = new Message();
			message.obj = "O(∩_∩)O";
			mHandlerTest2.sendMessage(message);
		}
	}
	
	private class HandlerTest2 extends Handler {

		private HandlerTest2(Looper looper) {
			super(looper);
		}

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			mTextView.setText("在主线程中,收到子线程发来消息:" + msg.obj);
			
			//3  收到消息后再发消息到子线程
			if (counter==0) {
				Message message = new Message();
				message.obj = "主线程发送的消息Xi~Xi";
				mHandlerTest1.sendMessage(message);
				counter++;
			}
			
		}
	}

}

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"
    >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:layout_centerInParent="true"
        android:layout_marginTop="70dip" />
    

</RelativeLayout>



相关文章
|
存储 消息中间件 Android开发
Handler切换线程原理解析
写在前面:本文的目的是想将Handler、Looper和Thread之间绑定的原理讲明白,如果没讲明白,也希望能给关于Handler的学习留个印象。 Android中的多线程间交互离不开Handler,开发中最常见的操作是在子线程中执行耗时操作,在主线程中更新UI,这其中就涉及到了Handler的线程切换操作。
|
消息中间件 存储 Java
【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
171 0
|
存储 消息中间件
Handler 中的 handleMessage 所在线程是由什么决定的?
大多数情况下,handleMessage所在线程和 handler 初始化所在的线程相同,但 handler 初始化的时候可以传入一个 Looper 对象,此时handleMessage所在线程和参数looper所在线程相同。
|
机器学习/深度学习 消息中间件 Android开发
Android多线程源码详解一:handler、looper、message、messageQueue
之前面试,面试官问到多线程通讯,巴拉巴拉说了些基础实现后面试官问handlerThread的底层实现,就卡住了。所以把Android多线程的知识点复习整理一下,写出来加深印象。 Android多线程通讯的核心是handler、looper、message、messageQueue,这篇文章就先记录下这套系统的源码要点,具体的实现方法下一篇文章再写。
|
Android开发
Android多线程源码详解一:handler、looper、message、messageQueue
Android多线程源码详解一:handler、looper、message、messageQueue之前面试,面试官问到多线程通讯,巴拉巴拉说了些基础实现后面试官问handlerThread的底层实现,就卡住了。
1557 0
|
Java Android开发
Android非UI主线程中,若干普通Java线程使用Handler发送接收消息
Android非UI主线程中,若干普通Java线程使用Handler发送接收消息 线程1和线程2均为普通Java线程,在Android中创建,然后在这两个普通Java线程中使用Handler发送和接收消息。
1233 0
|
消息中间件 Android开发