原則上兩種對話窗使用大同小異,差異在百分比進度對話窗增加 setMax(...) 與 setProgress(...) 兩個 API 的使用。
主要程式一樣是兩隻:main activity 與 worker thread,以及一隻紀錄 thread 的工具程式。
ProgressActivity
public class ProgressActivity extends Activity {
private static final String TAG = "ProgressActivity";
private ProgressDialog progressDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 建立並顯示進度對話窗
Utils.logThread();
this.progressDialog = new ProgressDialog(this);
this.progressDialog.setTitle("執行中");
this.progressDialog.setMessage("請稍後...");
this.progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
this.progressDialog.setMax(10);
this.progressDialog.show();
// 建立 worker thread,並交付由 main thread 建立的 handler,供 worker thread 稍後與 main thread 溝通
new Thread(new DoSomethingThread(this.handler)).start();
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Utils.logThread();
// main thread 從 main queue 取得 handler 丟進來的 message
// 再從該 message 取得 handler 物件
// 最後呼叫 handler 的 callback method - handleMessage 來改變進度或者關閉進度對話窗
int step = msg.getData().getInt("step", -1);
Log.d(TAG, "step -> " + step);
if (step == -1) {
progressDialog.dismiss();
}
else {
progressDialog.setProgress(step);
}
}
};
}DoSomethingThreadpublic class DoSomethingThread implements Runnable {
private Handler handler;
public DoSomethingThread(Handler handler) {
super();
this.handler = handler;
}
@Override
public void run() {
Utils.logThread();
for (int i = 1; i <= 10; i++) {
try {
// 停頓一秒鐘後,通知 main thread 送出進度
Thread.sleep(1000);
Message msg = this.handler.obtainMessage();
msg.getData().putInt("step", i);
// 丟一個 message 到 main queue 裡,由 main thread 接手處理
this.handler.sendMessage(msg);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
// 最後關閉進度對話窗
// 丟一個 message 到 main queue 裡,由 main thread 接手處理
this.handler.sendEmptyMessage(0);
}
}
Utils 程式請參考 使用 Android 繞圈進度對話窗 ProgressDialog。執行紀錄如下:
10-28 08:07:24.132: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:24.722: DEBUG/Utils(543): <Thread-11>id: 11, Priority: 5, Group: main 10-28 08:07:25.722: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:25.722: DEBUG/ProgressActivity(543): step -> 1 10-28 08:07:26.764: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:26.764: DEBUG/ProgressActivity(543): step -> 2 10-28 08:07:27.811: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:27.811: DEBUG/ProgressActivity(543): step -> 3 10-28 08:07:28.857: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:28.857: DEBUG/ProgressActivity(543): step -> 4 10-28 08:07:29.861: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:29.861: DEBUG/ProgressActivity(543): step -> 5 10-28 08:07:30.916: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:30.916: DEBUG/ProgressActivity(543): step -> 6 10-28 08:07:31.951: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:31.951: DEBUG/ProgressActivity(543): step -> 7 10-28 08:07:32.998: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:32.998: DEBUG/ProgressActivity(543): step -> 8 10-28 08:07:34.051: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:34.051: DEBUG/ProgressActivity(543): step -> 9 10-28 08:07:35.111: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:35.111: DEBUG/ProgressActivity(543): step -> 10 10-28 08:07:35.111: DEBUG/Utils(543): <main>id: 1, Priority: 5, Group: main 10-28 08:07:35.121: DEBUG/ProgressActivity(543): step -> -1

沒有留言:
張貼留言