【发布时间】:2012-08-13 16:16:22
【问题描述】:
我在 SDCard 上有一个巨大的数据库 (40MB)。我需要获取数据,查询中有LIKE,这很慢。
数据库请求大约需要 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 被冻结,在数据库请求之后
显示有关“未响应”的消息。
我用这种方式尝试了一个线程:
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卡上?
【问题讨论】:
-
数据库在 SD 卡上不是这个原因。您可以粘贴调用 AsyncTask 的代码部分吗?
-
调用代码很简单——按钮点击,更新
标签: android database android-asynctask progressdialog