Android ProgressDialog出现得太晚,消失得太快

Android ProgressDialog出现得太晚,消失得太快,android,android-asynctask,progressdialog,Android,Android Asynctask,Progressdialog,当我更新数据库时,我想显示一个进度对话框。我的问题是ProgressDialog出现得很晚,在4-5秒后,很快出现和消失,它在屏幕上停留了几毫秒,几乎你看不到它,然后新数据立即显示在列表中。这让我觉得ProgressDialog正在等待数据库更新编辑不需要太多时间,大约4,5秒,然后它显示在屏幕上,但很快就消失了。我希望当我按下“更新”按钮并停留在屏幕上大约4-5秒时,ProgressDialog立即出现 class MyAsyncTask extends AsyncTask<Void,

当我更新数据库时,我想显示一个进度对话框。我的问题是ProgressDialog出现得很晚,在4-5秒后,很快出现和消失,它在屏幕上停留了几毫秒,几乎你看不到它,然后新数据立即显示在列表中。这让我觉得ProgressDialog正在等待数据库更新编辑不需要太多时间,大约4,5秒,然后它显示在屏幕上,但很快就消失了。我希望当我按下“更新”按钮并停留在屏幕上大约4-5秒时,ProgressDialog立即出现

class MyAsyncTask extends AsyncTask<Void, Void, Void>{

        ProgressDialog myprogsdial;
        @Override
        protected void onPreExecute(){
            myprogsdial = ProgressDialog.show(MyActivity.this, null, "Upgrade", true);
        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub

                        RefreshDataBase();

                    }
                });

            return null;
        }

        @Override
        protected void onPostExecute(Void result){
            myprogsdial.dismiss();
        }

    }
当我调用它时,新的MyAsyncTask.execute

好吧,我想这个

RunUnuithReadNew Runnable{

是什么导致了这种行为

doInBackground在主UI线程的新线程中执行您的代码。然后,您将要在此线程中执行的代码放回主线程,导致进度对话框在末尾延迟,然后在postExecute中立即关闭

在这里可以找到一个很好的教程。

您不能使用runOnUiThread。您基本上做的是:

已启动新的非ui线程 从这个新的非ui线程,您向ui线程发布了一个长时间运行的任务。 已从非ui线程退出。 您的ui线程现在执行长时间运行的操作刷新数据库并阻塞ui。 你应该直接调用RefreshDataBase。如果这个方法涉及到UI,你必须重构它。

我已经解决了它,使用。 我已将功能与外观分开。 我在doInBackground中保留了下载新数据的功能,并在onPostExecute中更新了列表:获取名为setListAdaper和notifyDataSetChanged的新适配器。
当然,我退出了使用RunnuiThread。感谢大家的提示。

似乎您不知道自己在做什么……为什么在doInBackground中使用RunnuiThread?……现在您的代码流是这样的:我正在启动新的threadAsyncTask以在ui ThreadRunnuiThread上运行作业执行ProgressDialog时会发生什么。显示……在调用之前调用新建MyAsyncTask.execute,并在原始代码中维护对进度对话框的最终引用?我曾尝试直接调用RefreshDataBase,但它因以下原因崩溃:由:java.lang.RuntimeException:无法在未调用Looper.prepare的线程内创建处理程序。你是什么意思,我必须重构它?这是因为它使用som应在UI线程或至少在循环器线程上运行的ething。