SDCard に巨大なデータベース (40MB) があります。クエリでデータをフェッチする必要がありLIKE
ますが、これは非常に遅いです。
DB リクエストには約 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
、DB 要求中に表示されないことです。データベース クエリが終了すると、画面が短時間点滅します。ユーザーがデータベース要求中に画面をタップしようとすると、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());
}
});
SOでこのような問題をたくさん見つけましたが、何も役に立ちませんでした。DBがSDカードにあるのでしょうか?