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