我有疑问让我感到困惑。
想象一下,我想在另一个线程中做一些事情,比如获取GPS /位置内容,这在SDK文档中建议,必须使用后台线程。
所以问题是:
之间有什么区别通过Thread
AND
AsyncTask
创建Thread thread1 = new Thread(new Runnable()
...并实施run()
?
答案 0 :(得分:45)
AsyncTask是一个便利类,用于在新线程上完成一些工作,并在完成后使用调用它的线程(通常是UI线程)上的结果。它只是一个包装器,它使用了几个runnables,但处理了创建线程和处理线程之间消息传递的所有复杂性。
AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。
AsyncTask旨在成为Thread和Handler的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。
异步任务由在后台线程上运行的计算定义,其结果在UI线程上发布。异步任务由3种泛型类型定义,称为Params,Progress和Result,以及4个步骤,称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute。
Runnable接口是Java线程的核心。 Runnable接口应该由任何其实例都要由线程执行的类实现。
另外,如果我引用this blog:
如果你需要SIMPLE编码使用AsyncTask,如果你需要SPEED使用传统的java Thread。
答案 1 :(得分:2)
同时考虑从Android v4.04开始的计数,除非您失去与较低版本的兼容性,否则您一次不能拥有多个AsyncTasks
。意识到!
答案 2 :(得分:2)
主要差异:
AsyncTask是一个异步任务,由在后台线程上运行的计算定义,其结果发布在UI线程上。除非您在UI线程上使用Handler
并发布消息或通过实现正确的同步直接更改对象的属性,否则无法使用普通线程完成。
根据开发者指南的建议Thread performance,
要记住一些重要的性能方面。首先,默认情况下,应用程序将其创建的所有AsyncTask对象推送到单个线程中。因此,它们以串行方式执行,并且 - 与主线程一样 - 特别长的工作包可以阻塞队列。因此,我们建议您仅使用 AsyncTask来处理持续时间小于5毫秒的工作项。。
但正常Thread可用于长时间运行的任务。
普通java线程对于Android不太有用,而不像Android框架提供的HandlerThread。
用于启动具有looper的新线程的方便类。然后可以使用looper来创建处理程序类。请注意,仍然必须调用start()。
请参阅以下帖子了解更多详情:
答案 3 :(得分:0)
AsyncTask类的一个明显缺点是,在根据开始时间的顺序执行Android 3.0 asynctasks之后。除非您通过调用' executeOnExecutor(Executors.newCachedThreadPool())'来执行任务,否则任务将逐个执行。这个方法会创建自己的线程池。
答案 4 :(得分:0)
更好地使用支持库中的新Job Scheduler。
答案 5 :(得分:0)
AsyncTask已在api级别30中弃用。使用线程/可运行很方便