android 兩種異步進程ProgressDialog的顯示效果。
- AsyncTask
new Thread(new Runnable()
- 文章可能不太嚴謹 僅作存檔。
AsyncTask
- 背景
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
……
}
標準形式(簡單解釋)如果需要詳細連接請參考下面兩位大神的博客。
- http://blog.csdn.net/liuhe688/article/details/6532519
- http://blog.csdn.net/guolin_blog/article/details/11711405
1. Params
在執行AsyncTask時需要傳入的參數,可用於在後臺任務中使用。
2. Progress
後臺任務執行時,如果需要在界面上顯示當前的進度,則使用這裏指定的泛型作爲進度單位。
3. Result
當任務執行完畢後,如果需要對結果進行返回,則使用這裏指定的泛型作爲返回值類型。
這裏我們把AsyncTask的第一個泛型參數指定爲Void,表示在執行AsyncTask的時候不需要傳入參數給後臺任務。第二個泛型參數指定爲Integer,表示使用整型數據來作爲進度顯示單位。第三個泛型參數指定爲Boolean,則表示使用布爾型數據來反饋執行結果。
1. onPreExecute()
這個方法會在後臺任務開始執行之間調用,用於進行一些界面上的初始化操作,比如顯示一個進度條對話框等。
2. doInBackground(Params…)
這個方法中的所有代碼都會在子線程中運行,我們應該在這裏去處理所有的耗時任務。任務一旦完成就可以通過return語句來將任務的執行結果進行返回,如果AsyncTask的第三個泛型參數指定的是Void,就可以不返回任務執行結果。注意,在這個方法中是不可以進行UI操作的,如果需要更新UI元素,比如說反饋當前任務的執行進度,可以調用publishProgress(Progress…)方法來完成。
3. onProgressUpdate(Progress…)
當在後臺任務中調用了publishProgress(Progress…)方法後,這個方法就很快會被調用,方法中攜帶的參數就是在後臺任務中傳遞過來的。在這個方法中可以對UI進行操作,利用參數中的數值就可以對界面元素進行相應的更新。
4. onPostExecute(Result)
當後臺任務執行完畢並通過return語句進行返回時,這個方法就很快會被調用。返回的數據會作爲參數傳遞到此方法中,可以利用返回的數據來進行一些UI操作,比如說提醒任務執行的結果,以及關閉掉進度條對話框等。
下面代碼就是我的簡單試用,看源碼很簡單(僅作存檔)
package com.android.ui;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button button;
private ProgressDialog pd;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pd = new ProgressDialog(this);
pd .setCancelable(false);
button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/* 顯示ProgressDialog */
pd = ProgressDialog.show(MainActivity.this, "標題", "加載中,請稍後……");
/* 開啓一個新線程,在新線程裏執行耗時的方法 */
new Thread(new Runnable() {
@Override
public void run() {
spandTimeMethod();// 耗時的方法
handler.sendEmptyMessage(0);// 執行耗時的方法之後發送消給handler
}
}).start();
}
});
}
private void spandTimeMethod() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {// handler接收到消息後就會執行此方法
pd.dismiss();// 關閉ProgressDialog
}
};
}
第二種 更簡單 看代碼就能看懂
package com.android.ui;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button button;
private ProgressDialog pd;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) findViewById(R.id.button1);
pd = new ProgressDialog(this);
pd .setCancelable(false);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/* 顯示ProgressDialog */
pd = ProgressDialog.show(MainActivity.this, "標題", "加載中,請稍後……");
/* 開啓一個新線程,在新線程裏執行耗時的方法 */
new Thread(new Runnable() {
@Override
public void run() {
spandTimeMethod();// 耗時的方法
handler.sendEmptyMessage(0);// 執行耗時的方法之後發送消給handler
}
}).start();
}
});
}
private void spandTimeMethod() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {// handler接收到消息後就會執行此方法
pd.dismiss();// 關閉ProgressDialog
}
};
}
歡迎參考,僅作存檔