Android为了线程安全,不允许我们在UI线程外(即主线程外的子线程)操作UI。
1. 子线程为啥不能操作UI呢?
试想一下,如果多个线程都可以操作UI,不同线程都可以控制同一个UI,那么势必会出现线程安全问题。线程A在修改UI的同事,线程B也在改同一个UI,抢夺资源,且不同步。所以子线程操作UI都交给UI主线程去处理
2. 子线程中更新UI的4种方法
方法
一
:子线程调用Handler的sendMessage(message)发送事件。
方法二:Activity.runOnUiThread(Runnable )
方法四:AsyncTask
Activity.runOnUiThread( new Runnable()
{ public void run(){更新UI}}
);
方法三:View.post(Runnable )
方法四:AsyncTask
先从Handler讲起
3. Handler的用法
Handler的使用也有两种方式,一个是在主线程 Activity 中定义 Handler,另一个是在子线程类中定义Handler
此次直说最简单的Activity 中定义 Handler,线程类中定义Handler的使用方法和原理以后再说。
A.主线程中定义Handler
Handler handler= new Handler()//在主线程中创建,所以自动绑定主线程
{
@Override
public void handleMessage(Message msg) {
String x=(String )msg.obj;//msg.obj可以对message携带的数据进行还原,须强制类型转换
switch (msg.what)//根据what处理不同操作
{
case 1:
initData(true);//我自己的更新UI的方法
break;
case 2:
loadMoreData(page);//我自己的更新UI的方法
break;
}
}
B. 子线程中发送消息,完成UI操作
private void updateWeather() {
new Thread(new Runnable(){
@Override
public void run() {
//以下可以二选一
//1.耗时操作,完成之后发送消息给Handler,完成UI更新;
mHandler.sendEmptyMessage(0);
//2.需要数据传递,用下面方法;
Message msg =new Message();
msg.what = 1;//what可以区分message,用于在handleMessage中识别message;
msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;
mHandler.sendMessage(msg);
}
}).start();
}
原理下篇再讲