我在SDCard上有一個龐大的數據庫(40MB)。我需要提取數據,在查詢中使用LIKE
,這非常緩慢。ProgressDialog沒有在AsyncTask中顯示
數據庫請求大約需要5秒鐘。因此,我需要異步執行並使用ProgressDialog
。
我試過用AsyncTask
,但是問題出在ProgressDialog
。
它是這樣實現:
private class GetDataFromLangDB extends AsyncTask<String, String, String> {
private final ProgressDialog dialog = new ProgressDialog(TranslAndActivity.this);
@Override
protected void onPreExecute() {
super.onPreExecute();
urDBCursor.close();
curDBCursor = null;
scaAdapter = null;
this.dialog.setMessage("Loading data...");
this.dialog.show();
}
@Override
protected String doInBackground(String... whatSearch) {
String result = "";
if (myDatabaseAdapter != null) {
curDBCursor = myDatabaseAdapter.fetchAll(whatSearch[0]);
}
return result;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
prepareListView();
}
}
的問題是,ProgressDialog
沒有數據庫請求過程中。 完成數據庫查詢後,它在屏幕上短暫閃爍。當用戶在數據庫請求期間嘗試使用 點擊屏幕時,UI會凍結,並且在DB請求 顯示「無響應」消息。
我有一個線程試圖這樣說:
public void startProgress(View view, final String aWhatSearch) {
final ProgressDialog dialog = new ProgressDialog(MyActivity.this);
if (curDBCursor != null){
curDBCursor.close();
curDBCursor = null;
}
dialog.setMessage("Loading data...");
dialog.show();
Runnable runnable = new Runnable() {
public void run() {
curDBCursor = myDatabaseAdapter.fetchAll(aWhatSearch);
// dirty trick
try {
Thread.sleep(250); // it must be here to show progress
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
public void run() {
if (dialog.isShowing()) {
dialog.dismiss();
}
prepareListView();
}
});
}
};
new Thread(runnable).start();
}
的結果是一樣的,但是當我用的伎倆與Thread.sleep(250)
;在數據庫請求期間顯示 ProgressDialog
。但它不旋轉, 它在DB請求期間看起來凍結。
DB的東西被稱爲這樣(在搜索按鈕自來水後):
btnSearchAll.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// AsyncTask
new GetDataFromLangDB().execute(edtTextToSearch.getText().toString());
// or Thread
//startProgress(null, edtTextToSearch.getText().toString());
}
});
我發現了很多這樣的問題如此,但沒有什麼是有用的我。 難道數據庫在SD卡上?
DB在SD卡上不是這個原因。你能粘貼你調用AsyncTask的代碼部分嗎? – 2012-08-17 08:09:12
調用代碼很簡單 - 點擊按鈕,更新 – Peter 2012-08-17 08:35:35