IT虾米网

Android之消息机制(二)

Leo_wl 2022年11月07日 手机开发 1131 0

在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之间通信的机制。


本文参考链接:https://blog.csdn.net/tt75281920/article/details/25879747
评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!