在布局文件中创建TextView,用TextView的更新为例子,总结其更新常用方法
第一种方法:使用Handler.post()方法更新UI
Android不能再子线程中直接更新UI,必须使用Handler类进行更新。
在MainActivity的onCreate()方法中创建子线程
textView= (TextView) findViewById(R.id.textView);
handler=new Handler();
//创建子线程
new Thread(){
@Override
public void run() {
try {
Thread.sleep(2000);
handler1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
private void handler1() {
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("haha1");
}
});
}
第二种方法:在子线程中用Hanlder向主线程发送消息,在主线程中处理消息。子线程中用handler.sendEmptyMessage(1)向主线程发送消息,主线程用handleMessage(Message msg)处理消息。
textView= (TextView) findViewById(R.id.textView);
handler=new Handler(){
@Override
//用来处理子线程发过来的消息,完成UI更新
public void handleMessage(Message msg) {
textView.setText("haha2");
}
};
new Thread(){
@Override
public void run() {
try {
Thread.sleep(2000);
handler2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
//向主线程发送消息
private void handler2() {
handler.sendEmptyMessage(1);
}
第三种方法:用runOnUIThread进行更新,此时用不到Handler类进行辅助。
textView= (TextView) findViewById(R.id.textView);
new Thread(){
@Override
public void run() {
try {
Thread.sleep(2000);
handler3();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
private void handler3(){
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText("haha3");
}
});
}
第四种方法:直接用View.post()方法,此方法只是单纯的更新UI,与线程无关。
textView= (TextView) findViewById(R.id.textView);
handler4();
private void handler4(){
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("haha4");
}
});
}
以上即为更新Android更新UI常见的四种方式。
补充Handler的一点知识:Handler负责发送消息,Looper负责接收Handler发送过来的消息,并将消息回传给Handler自己。
MessageQueue是存储消息的容器