我在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