Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AsyncTask中未显示ProgressDialog_Android_Database_Android Asynctask_Progressdialog - Fatal编程技术网

Android AsyncTask中未显示ProgressDialog

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

我在SD卡上有一个巨大的数据库(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();
    }
}
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好运