gpt4 book ai didi

android - 为什么 AsyncTask 的 execute() 必须在 UI 线程上调用,即使 AsyncTask 在 internalHandler 中使用了 Looper.getMainLooper()?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:31 26 4
gpt4 key购买 nike

为什么必须在 UI 线程上调用 AsyncTask 的方法 execute(Params...),如 documentation 中所述即使 AsyncTask 在 internalHandler 中使用了 Looper.getMainLooper()?

我尝试创建任务并从后台线程调用它的 execute(Params...),它工作正常。

最佳答案

Why must the AsyncTask's method execute(Params...) invoked on the UI thread as stated in the documentation even though AsyncTask uses Looper.getMainLooper() in internalHandler?

为什么 有时可能是一个哲学问题...我检查了 Android API 25 的 AsyncTask 代码,代码本身并没有给我们一个直接的答案。只有开发这个类的人才知道为什么。

但是,代码告诉我们的是它可以将调用从后台线程转发到 UI 线程,但事实并非如此。因此,开发人员不具备这样做的专业知识,或者是懒惰,或者想要强制执行某种模式,或者其他任何原因。

I tried creating the task and calling its execute(Params...) from a background thread and it works fine.

请注意它有效,但不能保证始终有效。多线程编程非常棘手,它的调试简直就是人间 hell 。

在代码检查中,我注意到 onPreExecute() 调用是在调用 execute(Params...) 的同一线程中完成的。因此,如果您在后台线程中调用 execute(Params...),它将打破 onPreExecute() 在 UI 线程上运行的不变性。

关于android - 为什么 AsyncTask 的 execute() 必须在 UI 线程上调用,即使 AsyncTask 在 internalHandler 中使用了 Looper.getMainLooper()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42806375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com