handler是什么?
handler是android给我们提供用来更新UI的一套机制,也是一套消息处理的机制,我们可以发送消息,也可以通过他处理消息。
为什么要用handler?
Android在设计的时候,就封装了一套消息创建,传递,处理机制,如果不遵循这样的机制,就没有办法更新UI消息了,就会抛出异常消息。
handler用法(一)
代码示例:
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv1);
new Thread(){
public void run() {
try {
Thread.sleep(1000);
//更新文本信息
tv.setText("update Thread");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
}
异常原因:只能在原线程中更新UI
利用Handler更新UI,可以执行成功
public class MainActivity extends Activity {
private TextView tv;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv1);
new Thread(){
public void run() {
try {
Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//更新文本信息
tv.setText("update Thread");
}
});
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
}
利用handrle做一个图片轮询的示例:
public class MainActivity extends Activity {
private TextView tv;
private ImageView img;
private Handler handler = new Handler();
private int images[] = {R.drawable.one,R.drawable.two,R.drawable.three};
private int index;
private MyRunnable myRunnable= new MyRunnable();
class MyRunnable implements Runnable{
/**
* TODO 简单描述该重写方法的实现功能(可选).
* @author Administrator 2014-12-25
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
// TODO Auto-generated method stub
index ++;
index = index%3;
img.setImageResource(images[index]);
handler.postDelayed(myRunnable, 1000);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv1);
img = (ImageView) findViewById(R.id.imageView1);
handler.postDelayed(myRunnable, 1000);
}
}
Android为什么要设计只能通过Handler机制更新UI?
最根本的目的就是解决多线程并发问题,
假设如果在一个activity当中,有多个线程去更新UI并且都没有加锁机制,那么会产生什么问题?
***更新界面错乱
如果对更新UI的操作都进行加锁处理的话又会产生什么样的问题呢?
*****性能下降
handler的原理是什么?
一,Handler封装了消息的发送(主要包括消息发送给谁)
Looper
1.内部包含一个消息队列也就是MessageQueue,所有的Handler发送的消息都走向这个消息队列
2.Looper.Looper方法,就是一个死循环,不断的从MessageQueue取消息,如有消息就处理消息,没有就阻塞。
二,MessageQueue就是一个消息队列,可以添加消息,并处理消息
三,Handler也很简单,内部会跟Looper进行关联,也就是说在Handler的内部可以找到Looper,找到了Looper也就找到了MessageQueue,在Handler中发送消息,其实就是向MeaasgeQueue队列发送消息
总结:handler负责发送消息,Looper负责接收发送的消息,并直接把消息回传给handler自己
MessageQueue就是一个存储消息的容器
解析Android中跟新UI的几种方式
runOnUiThread
handler post
handler sendMessage
view post
代码片段:
public class MainActivity extends Activity {
private TextView textView;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
textView.setText("ok");
};
};
//这是第一种更新UI的方式
private void handler1(){
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
textView.setText("更新UI");
}
});
}
//这是第二种更新UI的方式
private void handler2(){
handler.sendEmptyMessage(1);
}
//这是第三种更新UI的方式
private void updateUI(){
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
textView.setText("更新UI");
}
});
}
// 这是第四种更新UI的方式
private void viewUI(){
textView.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
textView.setText("更新UI");
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textview);
new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
Thread.sleep(2000);
// handler2();
// updateUI();
viewUI();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
}