【问题标题】:AsyncTask ProgressDialog not showing with .get().get() 未显示 AsyncTask ProgressDialog
【发布时间】:2012-05-18 21:06:28
【问题描述】:

我正在使用AsyncTask 子类进行一些后台处理。问题是当我使用带有.get() 方法的类时,我在onPreExecute() 中指定的ProgressDialog 不显示。

如果我在 onPostExecute() 方法中使用回调,我工作得很好。

我的第一个想法是,这是因为 .get() 等待进程完成,但也不能阻塞 UI 线程,所以事实并非如此。

谁能解释为什么会出现这种行为以及是否有解决方法?如果可以的话,我真的很想使用.get() 方法。

【问题讨论】:

    标签: android android-asynctask android-progressbar


    【解决方案1】:

    我最初接受了另一个答案,但它似乎是错误的。

    .get() 方法将阻止 UI 线程等待结果,并且显示的任何对话框也将被阻止。这是此方法的预期行为。

    如果后台活动持续很长时间,唯一的选择是不使用.get(),而是对调用活动使用回调方法。

    【讨论】:

      【解决方案2】:

      在 UI 线程上调用 AysncTask.get() 将阻止 UI 线程执行并使 UI 线程等待 AysncTask.doInBackground() 完成。这样做实际上是牺牲了 AsycnTask 的好处,现在所有代码都在 UI 线程和后台线程中同步执行(仍然是两个线程,但 UI 线程现在等待后台线程)。

      另外请记住,您可能会通过在 UI 线程上调用 get() 得到 ANR 异常(阻塞超过 5 秒)。

      如果你真的必须使用它,请在 myAsyncTask.get() 之前调用你的 showDialog() 方法:

      showDialog();
      myAsyncTask.execute();
      myAsyncTask.get(); // <-- UI thread blocked and wait at this point.
      dismissDialog();// <-- This line will be executed after doInBackground() finish.
      

      希望这会有所帮助。

      【讨论】:

      • 是的,我猜...但是如果 UI 线程被阻止,我仍然不明白为什么在这种情况下会显示对话框
      • 这里的重点是在UI线程上调用showDialog()的地方,如果你在阻塞点(AsyncTask.get())之前调用它,它会显示没有任何问题。
      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 2012-08-13
      • 2014-07-25
      • 2014-10-11
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多