Android AsyncTask中未显示ProgressDialog
我在SD卡上有一个巨大的数据库(40MB)。我需要获取数据,在查询中使用Android AsyncTask中未显示ProgressDialog,android,database,android-asynctask,progressdialog,Android,Database,Android Asynctask,Progressdialog,我在SD卡上有一个巨大的数据库(40MB)。我需要获取数据,在查询中使用LIKE,速度非常慢 DB请求大约需要5秒钟。因此,我需要使用ProgressDialog异步地执行此操作 我用AsyncTask尝试了它,但问题在于ProgressDialog它是这样实现的: private class GetDataFromLangDB extends AsyncTask<String, String, String> { private final ProgressDialog
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();
}
}
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 stuff是这样调用的(点击搜索按钮后):
我在SO中发现了很多这样的问题,但没有什么对我有用。
可能是DB在SD卡上吗 我将对话框的定义放入AsyncTask类中,它对我来说运行良好。 看看这个例子(你必须在你的类名中更改类名:
private class doInBackground extends AsyncTask<Integer, Integer, Void> {
final ProgressDialog dialog = new ProgressDialog(NAMEOFCLASS.this) {
@Override
protected void onPreExecute() {
dialog.setCancelable(false);
dialog.setTitle(getString(R.string.daten_wait_titel));
dialog.setIcon(R.drawable.icon);
dialog.setMessage(getString(R.string.dse_dialog_speichern));
dialog.show();
}
@Override
protected void onCancelled() {
dialog.cancel();
}
我将对话框的定义放入AsyncTask类中,它对我来说运行良好。 看看这个例子(你必须在你的类名中更改类名:
private class doInBackground extends AsyncTask<Integer, Integer, Void> {
final ProgressDialog dialog = new ProgressDialog(NAMEOFCLASS.this) {
@Override
protected void onPreExecute() {
dialog.setCancelable(false);
dialog.setTitle(getString(R.string.daten_wait_titel));
dialog.setIcon(R.drawable.icon);
dialog.setMessage(getString(R.string.dse_dialog_speichern));
dialog.show();
}
@Override
protected void onCancelled() {
dialog.cancel();
}
可能这会帮助您。它看起来像类似的问题。尝试使用来查询您的数据库可能会帮助您。它看起来像类似的问题。尝试使用来查询您的数据库在类(活动)级别上声明您的对话框,如下所示
private ProgressDialog dialog = null;
当您想开始忙碌的工作时,显示进度对话框并调用异步任务类..如On Button click或任意
dialog = ProgressDialog.show(this,"Sending Email to your account please! wait...", true);
SendingEmailTask task = new SendingEmailTask();
String s = "";
task.execute(s);
创建像这样的内部类
private class SendingEmailTask extends AsyncTask<String, Void, String> {
protected String doInBackground(String... urls) {
//do your work here..
// like fetching the Data from DB or any
return null;
}
@Override
protected void onPostExecute(String str) {
//hide progress dialog here
dialog.dismiss();
}
}
私有类SendingEmailTask扩展了AsyncTask{
受保护的字符串doInBackground(字符串…URL){
//在这里做你的工作。。
//比如从DB或任何数据库获取数据
返回null;
}
@凌驾
受保护的void onPostExecute(字符串str){
//在此处隐藏进度对话框
dialog.dismise();
}
}
如果有此帮助,请告诉我!!像这样在类(活动)级别声明您的对话框
private ProgressDialog dialog = null;
当您想开始忙碌的工作时,显示进度对话框并调用异步任务类..如On Button click或任意
dialog = ProgressDialog.show(this,"Sending Email to your account please! wait...", true);
SendingEmailTask task = new SendingEmailTask();
String s = "";
task.execute(s);
创建像这样的内部类
private class SendingEmailTask extends AsyncTask<String, Void, String> {
protected String doInBackground(String... urls) {
//do your work here..
// like fetching the Data from DB or any
return null;
}
@Override
protected void onPostExecute(String str) {
//hide progress dialog here
dialog.dismiss();
}
}
私有类SendingEmailTask扩展了AsyncTask{
受保护的字符串doInBackground(字符串…URL){
//在这里做你的工作。。
//比如从DB或任何数据库获取数据
返回null;
}
@凌驾
受保护的void onPostExecute(字符串str){
//在此处隐藏进度对话框
dialog.dismise();
}
}
让我知道这是否是帮助!!DB在SD卡上不是原因。你能粘贴调用异步任务的部分代码吗?调用代码非常简单-点击按钮,更新的DB在SD卡上不是原因。你能粘贴调用异步任务的部分代码吗?调用代码非常简单点击le按钮,更新我认为他对对话框的定义是在AsyncTask中。他使用此对话框引用它。dialogYes对话框的定义是在AsyncTask中。因此,我不知道那里出了什么问题。可能在数据库负载较重的时候->由于SQLite驱动程序繁忙,设备没有响应…**可能我需要为这个(?)**好的。没错。那么唯一的区别就是Super.onpreexecute()行;也许删除这一行会有帮助。@Peter,你能给我们logcat吗?@JackTools.Net如果他删除super.OnPreExecute,它肯定会使应用程序崩溃。我认为他对对话框的定义是在AsyncTask中。他用这个来引用它。dialogYes对话框的定义是在AsyncTask中。因此,我不知道是什么ong在那里。可能在高DB负载期间->设备由于繁忙的SQLite驱动程序而没有响应…**可能我需要服务(?)**好的。没错。那么唯一的区别就是行Super.onpreexecute();也许删除这一行会有帮助。@Peter,你能给我们logcat吗?@JackTools.Net如果他删除super.on preexecute,它肯定会使应用程序崩溃以获得答案,但没有帮助。它仍然是一样的。我将使用AsyncQueryHandler尝试sinisha答案,或者我尝试将其包装到服务中好的,我没有与DB lo进行检查我不确定,但我这样做是为了发送电子邮件等,它对我很好。祝你好运AsyncQueryHandler谢谢你的回答,但它没有帮助。它仍然是一样的。我将尝试使用AsyncQueryHandler进行sinisha回答,或者我尝试将其包装到服务中好的,我没有检查数据库加载,所以对此不确定,但我这样做了用于发送电子邮件等,对我来说效果很好。祝AsyncQueryHandler好运