我正在使用一个AsyncTask
子类进行一些后台处理。问题是当我将类与.get()
方法一起使用时,ProgressDialog
我在 中指定的onPreExecute()
不显示。
如果我在方法中使用回调,我工作得很好onPostExecute()
。
我的第一个想法是,这是因为.get()
等待进程完成,但也不能阻塞 UI 线程,所以事实并非如此。
谁能解释为什么会出现这种行为以及是否有解决方法?如果可以的话,我真的很想使用这种.get()
方法。
我正在使用一个AsyncTask
子类进行一些后台处理。问题是当我将类与.get()
方法一起使用时,ProgressDialog
我在 中指定的onPreExecute()
不显示。
如果我在方法中使用回调,我工作得很好onPostExecute()
。
我的第一个想法是,这是因为.get()
等待进程完成,但也不能阻塞 UI 线程,所以事实并非如此。
谁能解释为什么会出现这种行为以及是否有解决方法?如果可以的话,我真的很想使用这种.get()
方法。
我最初接受了另一个答案,但似乎是错误的。
该.get()
方法将阻止 UI 线程等待结果,并且显示的任何对话框也将被阻止。这是此方法的预期行为。
The only alternative is to not use .get()
if the background activity is for any noticable amount of time and instead use callback methods to the calling activity.
在 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.
希望这可以帮助。