问题 onPostExecute()的“在UI线程上运行”真的意味着什么?


考虑在Activity中启动的AsyncTask。如果活动暂停或销毁会发生什么? onPostExecute()会运行吗?如果是,将使用什么UI线程?

就是想。

提前谢谢了。


7995
2018-05-21 13:23


起源

onPostExcecute 如果你的Activity被销毁,它会运行但是会因为尝试在死线程上运行而抛出异常。如果在活动可能关闭时运行AsyncTask,请考虑将代码移动到服务或使用加载器。 - Jave
如果活动被销毁:它将崩溃,因为它丢失了原始活动的引用。 Incase活动暂停,它仍然在该Activity上运行。对于这种情况:您应该使用意向服务,并通过广播获得结果。 - Tai Tran


答案:


UI线程在应用程序的整个可见生命周期中都可用,这可能跨越多个活动的组合。

您在视图中更改的任何内容都必须在UI线程上执行 onPostExecute 的 的AsyncTask 通过在UI线程上执行指令来反映相同的逻辑。

你可以用 runOnUiThread 在你自己 Thread 对视图进行更改。但是由于 的AsyncTask 具有 onPostExecute 方法(也在UI线程上运行),因此您不需要在逻辑上使用 runOnUiThread 那里。


更新

关于你的问题:是的, onPostExecute 仍将被调用(因为它由一个单独的线程调用),即使你的活动被销毁,如果该方法将操纵视图,你只需要获得 强制关闭 错误,因为对您的活动的引用不再可用。


11
2018-05-21 13:30



他的问题不同,请再读一遍 - Akram


它会崩溃 onPostExecute() 因为UI线程就像一个进程对话框。它发生在我身上,在我的Asynctask完成之前我的Activity销毁了。它说“窗户漏了.....”所以,我删除了 onPostExecute()。没有更多的崩溃..


1
2018-05-21 14:38





记得在onPause或onDestroyed中调用取消函数没有异常。


0
2018-05-21 14:07



感谢您的回答。 Wagas与您的提示一起回答将让我了解如何进一步增强我当前的设计。 - Harald Wilhelm