當我們在處理一些比較長時間的事件時候,比如讀取網絡或者數據庫的數據時候,就要用到Handler,有時候為瞭不影響用戶操作應用的流暢還要開多一個線程來區別UI線程,在新的線程裡面處理長時間的操作。開發的時候遇到數據處理都可以這樣用handler,靈活修改一下就可以做各種效果瞭。
第一步:ProgressDialog彈出旋轉框來提示長時間操作。
第二步:開多一個線程處理長時間操作,這裡讓線程睡覺10秒。
第三部:長時間操作結束後給handler發送一個消息,可以是一個整數,如果這個Activity有多個handler,可以定義多個整數成員變量來區別不同的消息。
第四步:在定義Handler的handlerMessage方法裡面把ProgressDialog對象dismiss()掉,把彈出框消滅表示操作完成。
代碼如下:
[java]
public class Android_HandlerActivity extends Activity {
/** Called when the activity is first created. */
//聲明變量
private Button b1;
private ProgressDialog pd;
//定義handler對象
private Handler handler = new Handler(){
//當有消息發送出來的時候就執行Handler的這個方法
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
//隻要執行到這裡就關閉對話框
pd.dismiss();
}
};
@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);
//給按鈕綁定單擊事件監聽器
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//點擊按鈕後去處理長耗時操作
processThread();
}
});
}
protected void processThread() {
// TODO Auto-generated method stub
//構建一個下載進度條
pd= ProgressDialog.show(Android_HandlerActivity.this, "下載文件", "正在下載……");
Log.i("tag", "processThread()–>"+Thread.currentThread().getName());
new Thread(){
@Override
public void run() {
Log.i("tag", "run()–>"+Thread.currentThread().getName());
//在新線程裡執行長耗時方法
longTimeMethod();
//執行完畢後給handler發送一個空消息
handler.sendEmptyMessage(0);
}
}.start();
}
//模擬下載文件的長耗時方法
protected void longTimeMethod() {
// TODO Auto-generated method stub
try {
Log.i("tag", "longTimeMethod–>"+Thread.currentThread().getName());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
main.xml隻是一個簡單的Button:
[html]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/Button01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
最後運行圖片如下:
摘自 heirenheiren的專欄