雾山的Android学习笔记---消息机制(二)

在Android中可以通过Handler,Looper,MessageQueue来实现线程之间的通信,这是Android中非常重要的功能。

下面举个简单的例子来实现(模拟从网络获取数据来改变TextView的值):

1,在主线程中实现Handler的handleMessage()方法

2,在Work Thread中通过Handler发送消息

开发步骤: 
1,新建一个Android应用程序 
2, 在布局文件中添加一个Button和一个TextView控件标签,并为其设置属性和值 
3, 在Activity中,声明Button和TextView控件变量并根据id获得控件对象 ,设置该Button的监听器
4, 在Activity中,在主线程中创建一个Handler对象 
5,在Activity中,创建一个Handler的继承类,并定义handlerMessage(Message msg)方法

6,在Acticity中,创建一个线程,来模拟从网络中获得数据

下面是代码:

package com.tangbc.s02e06_handler2;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
	private Button button;
	private TextView textView;
	private Handler handler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		button = (Button)findViewById(R.id.button);
		textView = (TextView)findViewById(R.id.textView);
		
		handler =new MyHandler();   //定义Handler的对象handler在主线程中
		button.setOnClickListener(new ButtonListener());
		
	}
	
	class MyHandler extends Handler{
		
		@Override
		public void handleMessage(Message msg) {
			String s =(String)msg.obj;   //Looper从MessageQueue中取出msg,并赋值给s
			textView.setText(s);
		}
	}
	
	class NetworkThread extends Thread{
		
		@Override
		public void run() {
			//模拟访问网络的延迟
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			String s = "从网络中获取的数据";
			//textView.setText(s);  这样做是错误的,因为在Android中只有main Thread 才能操作UI
			Message msg = handler.obtainMessage();
			msg.obj = s;
			handler.sendMessage(msg);
		}
	}
	
	class ButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			Thread t = new NetworkThread();
			t.start();
		}
	}

}
启动该程序时;
1,在主线程中声明了一个Handler对象handler

2,点击按钮后,启动NetworkerThread线程,该线程休眠2S后将字符串s发送到消息队列中

3,Looper将该对象从消息队列中取出后,赋给主线程中的handler(handle是在主线程中声明),并调用handlerMessage()方法修改TextView的值


通过这个例子可以看到,可以在work thread中发送消息,在从main thread中把消息取出执行,这是一种非常方便并有用的实现work thread和main thread之间通信的机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值