我知道这是多次被问过的问题。然而,有些东西我从来没有找到答案。所以希望有人能给我一些启示。
我们都知道AsyncTask和Thread是执行后台任务以避免ANR问题的选项。建议asynctask只应用于短期运行任务,而线程可用于长时间运行的任务。 asynctask不应该用于长任务的原因众所周知,这是因为asynctask可能导致泄漏,因为它可能会在活动被破坏后继续运行。这是令人信服的。但是,它也会导致其他一些问题:
由于
答案 0 :(得分:1)
因为没有人回复。那时我正在回答我自己的问题。
AsyncTask
的原因是没有方法可以取消正在运行的AsyncTask
。存在一个名为AsyncTask.cancel(true)
的方法,它调用onCancelled(Result result)
。但是,根据文档,这个方法“在调用cancel(boolean)并且doInBackground(Object [])完成后在UI线程上运行。” (https://developer.android.com/reference/android/os/AsyncTask.html)。另一方面,可以使用Thread
停止Thread.interrupt()
。AsyncTask
内运行Service
应该没有任何问题,前提是您知道AsyncTask
的取消限制,并且可以通过{创建内存泄漏的可能性{1}}。请注意,显然不需要在AsyncTask
中使用已在工作线程中运行的AsyncTask
。IntentService
而没有任何问题。请注意,同样的内存泄漏问题也适用于RxJava
。您也许可以找到一个具体问题here。关于使用RxJava
处理泄漏/屏幕旋转的一系列讨论也很容易通过谷歌搜索找到。答案 1 :(得分:0)
AsyncTask和Thread + Handler未经过精心设计和实现。 RxJava,Akka和其他异步执行框架似乎更加精心开发。
每种技术都有其局限性。 AsyncTask用于单个并行任务,能够在UI上显示进度。但是,如果重新生成活动(例如由于屏幕旋转),则与UI的连接将丢失(此问题的一种可能解决方案是https://github.com/rfqu/AsyncConnector)。
即使没有要处理的消息, Thread+Handler
也会为线程堆栈保留内存。这限制了可能的线程数。与处理程序线程相比,您可以拥有更多Akka actors
或RxJava Subscribers
,具有类似的功能。