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

Sha*_*rad 5 multithreading android android-asynctask

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

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

nan*_*ito 5

即使 AsyncTask 在 internalHandler 中使用 Looper.getMainLooper(),为什么必须按照文档中的说明在 UI 线程上调用AsyncTask的方法execute(Params...)

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

但是,代码告诉我们的是,它可以将调用从后台线程转发到 UI 线程,但事实并非如此。所以开发人员没有这样做的专业知识,或者是懒惰,或者想要强制执行一个模式,或者其他什么。

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

请注意它有效,但不能保证总是有效。多线程编程非常棘手,它的调试简直就是地狱。

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