文档章节

Android学习笔记: 使用 Handler 进行MainThread和WorkThread 通信

山哥
 山哥
发布于 2014/01/12 22:13
字数 631
阅读 309
收藏 1

1. 如何将 WorkerThread 运行结果反馈回MainThread,并在View中输出给用户?

a. 在MainThread中创建Handler对象,并重载 handleMessage(Message msg) 处理方法;
b. 在WorkerThread中使用MainThread中创建的 Handler对象进行消息发送和MainThread进行通信;

public class MainActivity extends Activity
{
	private TextView textView;
	private Button button;
	
	// 消息处理对象
	private Handler handler;
	
	@Override
	public void onCreate(...) {
		
		textView = (TextView)findViewById(R.id.textView1);
		button = (Button)findViewById(R.id.button1);
		
		button.setOnClickListener(new OnClickListener() {
			public void onClick(...) {
			    // 创建一个WorkerThread,并执行该Thread
				NetworkThread nwThread = new NetworkThread();
				nwThread.start();
			}
		});
		
		// 在主线程中声明一个消息处理对象Handler
		handler = new Handler() {
			// 重载消息处理方法,用于接收和处理WorkerThread发送的消息
			@Override
			public void handleMessage(Message msg) {
				String msg = (String)msg.obj;
				// 将WorkerThread发送的消息内容显示在TextView中
				textView.setText(msg);
			}
		};
	}
	
	/**
	 * 内部WorkerThread类:NetworkThread
	 */
	class NetworkThread extends Thread {
		@Override
		public void run() {
			// 模拟请求网络获取一个数据
			String str = "我来自网络的数据";
			// 使用主线程Handler对象创建一个消息体
			Message msg = handler.obtainMessage();
			msg.obj = str;
			
			// 发送消息,WorkerThread 向 MainThread 发送消息
			handler.sendMessage(msg);
		}
	}
	
}

2. 如何在MainThread中发送消息给WorkerThread进行处理?

a. 在WorkerThread中准备Looper(Looper.prepare());
b. 在WorkerThread中创建Handler对象,并重载 handleMessage(Message msg) 方法;
c. 在WorkerThread中调用 Looper.loop();
d. 在MainThread中使用WorkerThread创建的Handler对象进行发送消息;

public class MainActivity extends Activity
{
	private Button button;
	
	// 消息处理对象
	private Handler handler;
	
	@Override
	public void onCreate(...) 
	{
		button = (Button)findViewById(R.id.button1);
		
		button.setOnClickListener(new OnClickListener() {
			public void onClick(...) {
				String str = "WorkerThread收到请回答";
				// 使用WorkerThread创建的Handler对象创建一个消息体
				Message msg = handler.obtainMessage();
				msg.obj = str;
				
				// 发送消息,MainThread 向 WorkerThread 发送消息
				handler.sendMessage(msg);
			}
		});
		
		// 立刻创建一个WorkerThread,并执行该Thread
		NetworkThread nwThread = new NetworkThread();
		nwThread.start();
	}
	
	/**
	 * 内部WorkerThread类:NetworkThread
	 */
	class NetworkThread extends Thread {
		@Override
		public void run() {
			//1. 准备Looper
			Looper.prepare();
			
			//2. WorkerThread中创建一个消息处理对象Handler
			handler = new Handler() {
				// 重载消息处理方法,用于接收和处理WorkerThread发送的消息
				@Override
				public void handleMessage(Message msg) {
					System.out.println("WorkerThread收到消息!");
				}
			};
		
			//3. 调用Looper.loop()方法,从消息队列中不断获取消息,然后调用该消息对象的Handler对象的handleMessage(Message msg)进行处理
			// 如果消息队列中没有消息,则Looper线程阻塞等待
			Looper.loop();
			
		}
	}
	
}

以上就是 MainThread 和 WorkerThread 进行相互通信的方式。

© 著作权归作者所有

共有 人打赏支持
山哥

山哥

粉丝 246
博文 353
码字总数 136686
作品 0
南京
程序员
私信 提问
Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程。而由于Android采用UI单...

AlexZhuang
2012/04/11
0
0
浅析Android中的消息机制

在分析Android消息机制之前,我们先来看一段代码: 这段代码似乎看上去很正常,但是当你运行时就会发现,它会报一个致命性的异常: 到底是怎么回事呢?原因在于,Android系统中的视图组件并不...

hanzhankang
2014/01/25
0
0
Handler 都没搞懂,拿什么去跳槽啊?

前言 做 Android 开发肯定离不开跟 Handler 打交道,它通常被我们用来做主线程与子线程之间的通信工具,而 Handler 作为 Android 中消息机制的重要一员也确实给我们的开发带来了极大的便利。...

北辰丨丶
03/15
0
0
使用Thread+Handler实现非UI线程更新UI界面

概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程。而由于Android采用UI单...

鉴客
2011/09/17
15.2K
4
Android异步处理常用方法

声明:本文根据多篇博客整理,作为学习笔记,非常感谢他们贡献。 每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关...

我是IT码农
2015/05/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

取变量的地址赋值给另一个变量,C通过,C++编译出错

取变量的地址赋值给另一个变量,C通过。正常运行,C++编译出错。 代码如下: #include <stdio.h>int main(int argc, char *argv[]){int x = 3;int *p = &x;int y = p;/*c ...

SamXIAO
43分钟前
1
0
利用隐写术实施攻击

尽管隐写术是一种低频攻击途径,但网络犯罪分子已经开始利用它结合社交媒体的普遍性和快速传播性来传递恶意有效负载。 低调但有效的隐写技术虽然是旧把戏,但将代码隐藏在看似正常的图像中,...

Linux就该这么学
43分钟前
2
0
YII2的乐观锁和悲观锁

乐观锁与悲观锁¶ Web应用往往面临多用户环境,这种情况下的并发写入控制, 几乎成为每个开发人员都必须掌握的一项技能。 在并发环境下,有可能会出现脏读(Dirty Read)、不可重复读(Unrep...

echojson
49分钟前
2
0
UCOS线程切换原理

黑客画家
55分钟前
2
0
最牛Java架构师进阶路线(年薪80W)

1、源码分析专题 详细介绍源码中所用到的经典设计思想,看看大牛是如何写代码的,提升技术审美、提高核心竞争力。 帮助大家寻找分析源码的切入点,在思想上来一次巨大的升华。知其然,并知其...

别打我会飞
56分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部