1790 本講內(nèi)容:Handler使用入門 當(dāng)用戶點擊一個按鈕時如果執(zhí)行的是一個常耗時操作的話,處理不好會導(dǎo)致系統(tǒng)假死,用戶體驗很差,而Android則更進(jìn)一步,如果任意一個Acitivity沒有響應(yīng)5秒鐘以上就會被強(qiáng)制關(guān)閉,因此我們需要另外起動一個線程來處理長耗時操作,而主線程則不受其影響,在耗時操作完結(jié)發(fā)送消息給主線程,主線程再做相應(yīng)處理。那么線程之間的消息傳遞和異步處理用的就是Handler。 下面我們通過一個模擬文件下載的這個長耗時操作來做個說明: 1、新建一個項目 Lesson27_Handler 2、在MainHandler.java中寫如下面內(nèi)容: - package android.basic.lesson27;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainHandler extends Activity {
//聲明變量
private Button b1;
private ProgressDialog pd;
//定義Handler對象
private Handler handler =new Handler(){
@Override
//當(dāng)有消息發(fā)送出來的時候就執(zhí)行Handler的這個方法
public void handleMessage(Message msg){
super.handleMessage(msg);
//只要執(zhí)行到這里就關(guān)閉對話框
pd.dismiss();
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res= this.getResources();
//查看UI組件所在的線程名
Log.i("tag", "onCreate()-->"+Thread.currentThread().getName());
//定義UI組件
b1= (Button)findViewById(R.id.Button01);
//給按鈕綁定單擊事件監(jiān)聽器
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//點擊按鈕后去處理長耗時操作
processThread();
}
});
}
private void processThread(){
//構(gòu)建一個下載進(jìn)度條
pd= ProgressDialog.show(MainHandler.this, "下載文件", "正在下載……");
Log.i("tag", "processThread()-->"+Thread.currentThread().getName());
new Thread(){
@Override
public void run(){
Log.i("tag", "run()-->"+Thread.currentThread().getName());
//在新線程里執(zhí)行長耗時方法
longTimeMethod();
//執(zhí)行完畢后給handler發(fā)送一個空消息
handler.sendEmptyMessage(0);
}
}.start();
}
//模擬下載文件的長耗時方法
private void longTimeMethod(){
try {
Log.i("tag", "longTimeMethod-->"+Thread.currentThread().getName());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
復(fù)制代碼 3、res/layout/main.xml的內(nèi)容就省略了,你們可以根據(jù)程序運(yùn)行截圖和程序代碼反推出來布局組件。 4、運(yùn)行程序查看結(jié)果: 這個例子里,在輔助線程的run方法中執(zhí)行長耗時操作,操作完畢后調(diào)用handler.sendEmptyMessage()方法,主線程中的Handler的 handleMessage()方法接受到這一消息,并做了就是關(guān)閉對話框的處理。 在接下來的例子里,讓我們處理一些更復(fù)雜的操作來理解和練習(xí)Handler的使用方法。 (待續(xù)) |