Android的UI操作不是线程安全的,所以多线程并发操作UI组件可能导致线程安全问题,所以规定:只允许在主线程中修改UI组件
Android的Handler消息传递机制解决了Android 的多线程问题,Handler是在主线程和子线程之间 传递信息的,就是两个线程间的“传话员”
Handler类主要作用是;1.在新线程中发送消息,2.在主线程中获取处理消息
在开发中要重写Handler的处理消息方法,当新线程启动发送消息时,消息会发送到关联的MessageQueue中,Handler会不断地从MessageQueue中获取并处理消息
Handler的handleMessage(Message msg)用于处理消息,任然在主线程中,新线程用sendMessage(Message msg)发送消息
在子线程中sendMessage发送,在Handler或者Handler子类中使用handleMessage来处理消息实现主线程和子线程通讯
public class MainActivity extends Activity implements android.view.View.OnClickListener {
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.buttonId);
textView = (TextView)findViewById(R.id.textViewId);
//主线程中接收处理消息
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String s = (String)msg.obj;
textView.setText(s);
}
};
button.setOnClickListener(new OnClickListener(this));
}
@Override
public void onClick(View v) {
// 开启新线程并发送消息
new NetThread(new Runnable(){
@Override
public void run() {
// 模拟访问网路
super.run();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String s = "从网络获取的数据";
Message msg = handler.obtainMessage();
msg.obj = s;
handler.sendMessage(msg);
}
}).start();
}
}
·
Handler、Loop、MessageQueue的工作原理Handler组件:
Message:消息对象,用于Handler接受处理
Looper:每个线程只能有一个Looper负责读取MessageQueue的消息,并发送给Handler
MessageQueue:管理Message
Handler正常工作在当前线程必须有一个Looper对象,Handler handler = new Handler();相当于Handler handler = new Handler(Looper.myLooper);
保证当前线程有Looper对象,可以有两种方法:
1.在主线程中初始化一个Looper对象,程序可直接创建Handler
2.自己创一个Looper对象并启动他,调用prepare()即可
在线程中使用Handler的步骤:
1.调用Looper的prepare()创建Looper对象
2.创建Handler子类的实例,重写handleMessage()方法
3.调用Looper的loop()方法启动
public class MainActivity extends Activity {
private Button button;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.buttonId);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
System.out.println(Thread.currentThread().getName());
Message msg = handler.obtainMessage();
handler.sendMessage(msg);
}
});
WorkThread wt = new WorkThread(); //创建新线程
wt.start();
}
class WorkThread extends Thread{
@Override
public void run() {
Looper.prepare(); //1.创建Looper对象对象
handler = new Handler(){ //2.创建Handler子类实例
public void handleMessage(Message msg) {
//处理方法
}
};
Looper.loop(); //3.启动Looper
}
}
}