雾山的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中,创建一个线程,来模拟从网络中获得数据

下面是代码:

  1. package com.tangbc.s02e06_handler2;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.view.Menu;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.Button;  
  11. import android.widget.TextView;  
  12.   
  13. public class MainActivity extends Activity {  
  14.     private Button button;  
  15.     private TextView textView;  
  16.     private Handler handler;  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_main);  
  22.           
  23.         button = (Button)findViewById(R.id.button);  
  24.         textView = (TextView)findViewById(R.id.textView);  
  25.           
  26.         handler =new MyHandler();   //定义Handler的对象handler在主线程中   
  27.         button.setOnClickListener(new ButtonListener());  
  28.           
  29.     }  
  30.       
  31.     class MyHandler extends Handler{  
  32.           
  33.         @Override  
  34.         public void handleMessage(Message msg) {  
  35.             String s =(String)msg.obj;   //Looper从MessageQueue中取出msg,并赋值给s   
  36.             textView.setText(s);  
  37.         }  
  38.     }  
  39.       
  40.     class NetworkThread extends Thread{  
  41.           
  42.         @Override  
  43.         public void run() {  
  44.             //模拟访问网络的延迟   
  45.             try {  
  46.                 Thread.sleep(2000);  
  47.             } catch (InterruptedException e) {  
  48.                 e.printStackTrace();  
  49.             }  
  50.             String s = "从网络中获取的数据";  
  51.             //textView.setText(s);  这样做是错误的,因为在Android中只有main Thread 才能操作UI   
  52.             Message msg = handler.obtainMessage();  
  53.             msg.obj = s;  
  54.             handler.sendMessage(msg);  
  55.         }  
  56.     }  
  57.       
  58.     class ButtonListener implements OnClickListener{  
  59.   
  60.         @Override  
  61.         public void onClick(View v) {  
  62.             Thread t = new NetworkThread();  
  63.             t.start();  
  64.         }  
  65.     }  
  66.   
  67. }  
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、付费专栏及课程。

余额充值