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

如果我使用带有 onPostExecute() 方法。

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

任何人都可以解释为什么这种行为是如此,如果有解决方法??我真的很想用 .get() 方法,如果我可以。

有帮助吗?

解决方案

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

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

唯一的选择是不使用 .get() 如果后台活动是任何明显的时间量,而是使用回调方法调用活动。

其他提示

打电话来 AysncTask.获取() 在UI线程上会阻塞UI线程执行并使UI线程等待AysncTask。doInBackground()完成。通过这样做,你实际上牺牲了AsycnTask的好处,现在所有代码都在UI线程和后台线程中同步执行(仍然是两个线程,但UI线程现在等待后台线程)。

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

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

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

希望这有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top