ProgressDialog显得太晚,消失得太快

时间:2012-01-11 17:00:23

标签: android android-asynctask progressdialog

当我更新我的数据库时,我想显示一个进度对话框。我的问题是ProgressDialog出现迟到了,在4-5秒之后,然后出现并且消失的速度非常快,它在屏幕上几毫秒几乎看不到它,然后立即在列表中显示新数据。这让我觉得ProgressDialog正在等待数据库更新(它不需要花费太多,大约4.5秒)然后它会在屏幕上显示但是很快就会消失。我想立即显示ProgressDialog我按下“更新”按钮并在屏幕上停留4-5秒。

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();
        }

    }

当我打电话时,new MyAsyncTask().execute();

3 个答案:

答案 0 :(得分:6)

好的,我认为这个

  

runOnUiThread(new Runnable(){

导致此行为。

doInBackground()在新的线程中执行代码到主UI线程。然后,您将在此线程中执行的代码放回到主线程中,导致进度对话框在结束时被延迟,然后在postExecute()中立即关闭。

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

答案 1 :(得分:2)

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

  1. 开始新的非ui线程
  2. 从这个新的非ui线程中,您向UI线程发布了一个长时间运行的任务。
  3. 退出非ui线程。
  4. 您的ui线程现在执行长时间运行的操作(RefreshDataBase)并阻止UI。
  5. 您应该直接致电RefreshDataBase()。如果此方法触及UI,则必须重构它。

答案 2 :(得分:1)

我使用this answer of Vladimir Ivanov解决了这个问题。 我已经通过外观分离了功能。 我保留了doInBackground()onPostExecute()中的功能(下载新数据)我更新了列表:获取名为setListAdaper()notifyDataSetChanged的新适配器。 当然,我退出使用runOnUiThread()。感谢所有提示。