Android中FutureTask和AsyncTask的区别

6
我想知道在Android中FutureTaskAsyncTask的区别。根据我的理解,我们可以使用FutureTask获取当前状态。使用ExecutorService,我们可以创建一组并行进程,同样的属性也可以通过AsyncTask实现。我想知道何时使用AsyncTask以及何时使用FutureTask。
我在这里提出了一个问题但没有得到任何回复。现在我认为我应该改变获取Web服务数据的方式。所以我想使用FutureTask,因为它们有像isDone()和cancel()这样的函数。
请有人指导我从Web服务检索数据的更好方法,因为我的textView设置适配器太慢了。
或者简单地说,我需要一种取消正在运行的AsyncTasks或将其替换为当前任务的方法。当用户按下w时,它会调用AsyncTask,并且当用户在AutotextView中添加任何单词时,它将三次调用waka,一次为wawak,一次为waka。当用户按下另一个文本时,是否可能取消正在运行的任务。 有关详细信息,请参见我的问题

1
它们就像河岸和电容器银行之间的区别一样不同。两个完全不同的类,你可以通过阅读文档来了解它们各自的目的:FutureTaskAsyncTask - Mister Smith
1
我已经阅读了两个文档,但仍然不清楚何时使用哪个。似乎我总是可以使用future task... - clocksmith
1
"@813951"这句话是一种侮辱,而不是答案。 - Maarten
2个回答

6

AsyncTask提供了回调函数(onPreExecute, onProgressExecute, 和 onPostExecute),这些函数保证在UI线程上运行。但是AsyncTask已经被弃用了(感谢chokdee)。

FutureTask没有提供回调函数,也不知道Android的UI线程。实际上,Android应用程序不应该从UI线程中调用Future.get(),因为它可能会阻塞。

Android应用程序应该使用Kotlin协程。如果你还在使用Java,请使用FutureTask


2
自 API 等级 30 开始,AsyncTask 已被弃用,应使用 FutureTask 或 Executor。 - chokdee

0

异常处理:

如果异常在AsyncTask.doInBackground中抛出,那么该异常将作为RuntimeException在AsyncTask线程池线程(通常不是UI线程)中重新抛出。

如果异常在FutureTask.run中抛出,则该异常将被FutureTask捕获并在调用FutureTask.get()时重新抛出。

isCancelled()调用

在FutureTask.run中无法调用FutureTask.isCancelled(),但在AsyncTask.doInBackground中可以调用AsyncTask.isCancelled()。


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