由于 UI 线程(主线程)不能长时间等待,所有 Android 异步操作使用率非常高。异步操作就是重新开一个线程来处理事件,这写线程都是非 UI 线程,不能直接对 UI 进行操作(比如给 TextView 填写内容)。以下介绍 4 种异步访问 UI 的方法:
一、Handler 方法
1、接收消息
定义一个 Handler 对象处理所有线程消息。
private static final int MSG_SUCCESS = 0;
private static final int MSG_FAIL = -1;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SUCCESS: {
break;
}
case MSG_FAIL: {
break;
}
default:
break;
}
};
};
2、点击事件
多个线程使用同一个 Handler 对象发送消息。
public void pay(View v) {
Runnable runnable = new Runnable() {
@Override
public void run() {
Message msg = new Message();
msg.what = MSG_FAIL;
mHandler.sendMessage(msg);
}
};
Thread thread = new Thread(runnable);
thread.start();
}
public void check(View v) {
Runnable checkRunnable = new Runnable() {
@Override
public void run() {
Message msg = new Message();
msg.what = MSG_SUCCESS;
mHandler.sendMessage(msg);
}
};
Thread thread = new Thread(checkRunnable);
thread.start();
}
二、AsyncTask 方法
// UI线程中执行
new DownloadImageTask().execute( "www.91dota.com" );
private class DownloadImageTask extends AsyncTask {
protected String doInBackground( String... url ) {
return loadDataFormNetwork( url[0] );//后台耗时操作
}
protected void onPostExecute( String result ) {
myText.setText( result ); //得到来自网络的信息刷新页面
}
}
三、View.post(Runnable ) 方法
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
// 耗时操作
loadNetWork();
myText. (new Runnable() {
myText.setText(来自网络的信息);
});
}
}).start();
}
四、Activity.runOnUiThread(Runnable ) 方法
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
// 耗时操作
loadNetWork();
Activity.runOnUiThread. (new Runnable() {
myText.setText(来自网络的信息);
});
}
}).start();
}
后一篇: 500 错误的另一种原因