【问题标题】:Show ProgressDialog in onPreExecute but it appear and dismiss in onPostExecute at the same time在 onPreExecute 中显示 ProgressDialog 但它同时在 onPostExecute 中出现和关闭
【发布时间】:2014-05-02 08:40:18
【问题描述】:

我想在使用在活动类中扩展 AsyncTask 的私有类运行耗时方法时显示 ProgressDialog。但是应该出现在onPreExecute中的ProgressDialog在onPreExecute时没有出现。取而代之的是,在耗时的方法完成后,ProgressDialog 会立即显示并关闭。

            public class ABC extends Activity {

            /*somewhere in ABC
                load = new Load();
                load.execute(a,b,c);
                int action = load.get();*/

            private class Load extends AsyncTask<Object, Integer, Integer>{ 

                    private ProgressDialog progDailog;

                    @Override
                    protected Integer doInBackground(Object... param) {
                        Log.v("!!!!!!Load!!!!!!!!!","doInBackground");
                        Object a = (Object) param[0];
                        int b = (Integer) param[1];
                        int c = (Integer) param[2];
                        return a.doSomething(b, c);
                    }

                    @Override
                    protected void onPostExecute(Integer result) {
                        super.onPostExecute(result);            
                        progDailog.dismiss();
                        Log.v("!!!!!!Load!!!!!!!!!","onPostExecute");
                    }

                    @Override
                    protected void onPreExecute() {
                        super.onPreExecute();
                        Log.v("!!!!!!Load!!!!!!!!!","onPreExecute");
                        progDailog = new ProgressDialog(ABC.this); 
                        progDailog.setMessage("Loading..."); 
                        progDailog.show();
                    }


                }

            }

下面是logcat:

05-03 00:38:49.202: V/!!!!!!Load!!!!!!!!!(14666): preExecute
05-03 00:38:49.202: D/ProgressBar(14666): setProgress = 0
05-03 00:38:49.202: D/ProgressBar(14666): setProgress = 0, fromUser = false
05-03 00:38:49.202: D/ProgressBar(14666): mProgress = 0mIndeterminate = false, mMin = 0, mMax = 10000
05-03 00:38:49.232: V/!!!!!!Load!!!!!!!!!(14666): doInBackground
05-03 00:38:53.662: I/Choreographer(14666): Skipped 269 frames!  The application may be doing too much work on its main thread.
05-03 00:38:53.762: D/ProgressBar(14666): updateDrawableBounds: left = 0
05-03 00:38:53.762: D/ProgressBar(14666): updateDrawableBounds: top = 0
05-03 00:38:53.762: D/ProgressBar(14666): updateDrawableBounds: right = 144
05-03 00:38:53.762: D/ProgressBar(14666): updateDrawableBounds: bottom = 144
05-03 00:38:53.772: V/!!!!!!Load!!!!!!!!!(14666): onPostExecute

【问题讨论】:

  • 如果您看到进度条 onPreExecute 必须工作。你能显示日志的输出吗? doInBackgroudn 真的不做 mutch,这将很快完成。

标签: android android-asynctask progressdialog


【解决方案1】:

这取决于doSomeThing 方法的定义。由于此方法或您正在执行的操作的执行时间非常短。这就是为什么它会立即消失。但是,如果您想查看对话框或一致性,它是否正常工作。你可以睡在doInBackground方法中。将此代码粘贴到你的doInBackground方法中

try{
Thread.sleep(3000);
}
catch(Exception e){
e.printStackTrace();
}

现在您将看到对话框持续三秒钟。

【讨论】:

  • doInBackground 方法执行需要几秒钟,但在方法完成后会出现 ProgressDialog
  • 你能发布你的logcat吗..?..这样我可以看到日志出现的顺序。
  • 是的。问题是 logcat 显示很好,但是当 logcat 显示“!!!!!!Load!!!!!!!!!”时没有显示progressDialog “预执行”。我在 onPreExecute 之后几秒钟但在 onPostExecute 之前看到了 progressDialog。
  • 你在用模拟器吗?
  • 尝试将休眠代码置于预执行中。它不起作用
【解决方案2】:

只需更改异步类中方法的流程即可。

public class ABC extends Activity {

        /*somewhere in ABC
            load = new Load();
            load.execute(a,b,c);
            int action = load.get();*/

        private class Load extends AsyncTask<Object, Integer, Integer>{ 

                private ProgressDialog progDailog;

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                    Log.v("!!!!!!Load!!!!!!!!!","onPreExecute");
                    progDailog = new ProgressDialog(ABC.this); 
                    progDailog.setMessage("Loading..."); 
                    progDailog.show();
                }
                @Override
                protected Integer doInBackground(Object... param) {
                    Log.v("!!!!!!Load!!!!!!!!!","doInBackground");
                    Object a = (Object) param[0];
                    int b = (Integer) param[1];
                    int c = (Integer) param[2];
                    return a.doSomething(b, c);
                }

                @Override
                protected void onPostExecute(Integer result) {
                    super.onPostExecute(result);            
                    progDailog.dismiss();
                    Log.v("!!!!!!Load!!!!!!!!!","onPostExecute");
                }




            }

        }

【讨论】:

  • 这是完全相同的流程,只是方法被重新排序
  • 你检查 doInBackground 执行是否正确..?
  • 异步类主要用于执行网络任务。您正在使用对象和 int 值,并且几乎不需要毫秒来执行任务,这就是您的进度对话框显示并关闭的原因。
  • @user1632209 doInBackground 执行正确。如果 async 类主要用于执行网络任务,我可以使用对象和 int 值来做什么?
  • 可以在oncreate方法中执行。
猜你喜欢
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 2015-10-21
相关资源
最近更新 更多