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

6
为什么必须在UI线程上调用AsyncTask的方法execute(Params...),即使AsyncTask在internalHandler中使用Looper.getMainLooper(),文档documentation中已经说明了这一点?
我尝试从后台线程创建任务并调用其execute(Params...),它可以正常工作。
1个回答

5
为什么即使AsyncTask在internalHandler中使用Looper.getMainLooper(),文档还是要求在UI线程调用AsyncTask的方法execute(Params...)?
有时候,“为什么”可能是一个哲学问题……我检查了Android API 25的AsyncTask代码,但代码本身并没有给出明确答案。只有开发这个类的人知道为什么。
但是,代码确实告诉我们它可以将来自后台线程的调用转发到UI线程,但它没有这样做。因此,开发者可能没有能力这样做,或者懒惰,或者希望强制执行一种模式,或者其他原因。
我尝试创建任务并从后台线程调用其execute(Params...),它正常工作。
请注意,它能工作,但不能保证总是能工作。多线程编程非常棘手,而且调试可能非常困难。
在对代码进行检查时,我注意到onPreExecute()调用是在调用execute(Params...)的同一线程中完成的。因此,如果您在后台线程中调用execute(Params...),它将破坏onPreExecute()在UI线程上运行的不变性。

我真的很感激如果对我进行了负评的人能在评论中表达他或她的动机。 - nandsito
我点赞了这个答案,特别是最后一部分对问题的回答非常好。 - Endzeit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接