我有点困惑处理器,AsyncTask和线程之间的区别在Android。我在StackOverflow上读过不少博客和问题。
Handler是后台线程,为您提供与UI通信。例如,更新进度条应该通过Handler来完成。使用Handlers可以获得MessagingQueues的优势,因此如果您想调度消息或更新多个UI元素或有重复任务。
AsyncTask是类似的,事实上,他们利用Handler,但不运行在UI线程,所以它很适合抓取数据,例如抓取web服务。稍后您可以与UI交互。
然而,线程不能与UI交互,提供更多的“基本”线程,你错过了AsyncTask的所有抽象。
但是,我希望在服务中运行套接字连接。这应该运行在一个处理程序或线程,甚至一个AsyncTask?UI交互根本不需要。它对我使用的性能有影响吗?
同时,文档也得到了很大的改进。
这取决于选择哪一个是基于需求的
Handler主要用于从其他线程切换到主线程,Handler附加到一个循环器,它在队列中发布其可运行任务。
所以如果你已经在其他线程和切换到主线程,那么你需要处理而不是异步任务或其他线程
如果在主线程之外创建的Handler不是一个looper,则不会在线程创建Handler时给出错误,该线程需要被创建为lopper
AsyncTask用于执行在后台线程上运行的代码,并将其结果传递给主线程
** *异步任务限制
1. 异步任务不附加到活动的生命周期,即使它的活动被破坏,它也会继续运行,而加载器没有这个限制
2. 所有异步任务共享相同的后台线程执行,这也会影响应用程序的性能
线程在应用程序中用于后台工作,但它在主线程上没有任何回调。
如果要求适合一些线程,而不是一个线程,需要给任务很多次,那么线程池执行器是更好的选择。Eg要求图像加载从多个url像滑翔。
这取决于选择哪一个是基于需求的
Handler主要用于从其他线程切换到主线程,Handler附加到一个循环器,它在队列中发布其可运行任务。
所以如果你已经在其他线程和切换到主线程,那么你需要处理而不是异步任务或其他线程
如果在主线程之外创建的Handler不是一个looper,则不会在线程创建Handler时给出错误,该线程需要被创建为lopper
AsyncTask用于执行在后台线程上运行的代码,并将其结果传递给主线程
** *异步任务限制
1. 异步任务不附加到活动的生命周期,即使它的活动被破坏,它也会继续运行,而加载器没有这个限制
2. 所有异步任务共享相同的后台线程执行,这也会影响应用程序的性能
线程在应用程序中用于后台工作,但它在主线程上没有任何回调。
如果要求适合一些线程,而不是一个线程,需要给任务很多次,那么线程池执行器是更好的选择。Eg要求图像加载从多个url像滑翔。
就像Vogella网站上关于Android后台处理的教程,AsyncTask和Loaders一样:
Handler类可用于注册到线程,并提供一个简单的通道将数据发送到该线程。
AsyncTask类封装了后台进程的创建和与主线程的同步。它还支持报告正在运行的任务的进度。
线程基本上是多线程的核心元素,开发人员使用它有以下缺点:
如果您使用Java线程,则必须处理以下需求
在你自己的代码中:
如果将结果返回到用户界面,则与主线程同步
没有取消线程的默认值
没有默认线程池
Android中没有处理配置更改的默认值
关于AsyncTask,正如Android开发者参考所说:
AsyncTask enables proper and easy use of the UI thread. This class
allows to perform background operations and publish results on the UI
thread without having to manipulate threads and/or handlers.
AsyncTask is designed to be a helper class around Thread and Handler
and does not constitute a generic threading framework. AsyncTasks
should ideally be used for short operations (a few seconds at the
most.) If you need to keep threads running for long periods of time,
it is highly recommended you use the various APIs provided by the
java.util.concurrent package such as Executor, ThreadPoolExecutor and
FutureTask.
2015年5月更新:我找到了一个涵盖这个主题的优秀系列讲座。
这是谷歌搜索:道格拉斯施密特讲座android并发和同步
这是YouTube上第一节课的视频
所有这些都是来自范德堡大学的CS 282 (2013): Android系统编程的一部分。这是YouTube播放列表
道格拉斯·施密特似乎是个出色的讲师
重要提示:如果你正在考虑使用AsyncTask来解决线程问题,你应该首先检查ReactiveX/RxAndroid,以获得更合适的编程模式。有一个很好的资源可以让你得到一个概览,那就是学习RxJava 2 for Android的例子。
线程
当你启动一个应用程序时,会创建一个进程来执行代码。为了有效地利用计算资源,可以在进程内启动线程,以便同时执行多个任务。所以线程允许你通过有效地利用cpu而没有空闲时间来构建高效的应用程序。
在Android中,所有组件都在一个称为主线程的线程上执行。Android系统将任务排队,并在主线程中逐个执行。当长时间运行的任务执行时,应用程序变得无响应。
为了防止这种情况,您可以创建工作线程并运行后台或长时间运行的任务。
是
由于android使用单线程模型,UI组件是创建非线程安全的,这意味着只有它创建的线程应该访问它们,这意味着UI组件应该只在主线程上更新。由于UI组件运行在主线程上,运行在工作线程上的任务不能修改UI组件。这就是Handler出现的地方。Handler在Looper的帮助下可以连接到新线程或现有线程,并在连接的线程上运行它包含的代码。
处理器使线程间通信成为可能。后台线程可以通过Handler将结果发送给后台线程,连接到主线程的Handler可以更新主线程上的UI组件。
AsyncTask
AsyncTask提供的android使用线程和处理程序,使运行简单的任务在后台和更新结果从后台线程到主线程容易。
请参见android thread, handler, asynctask和线程池的例子。
线程
Android支持标准的Java线程。您可以使用标准线程和包“java.util”中的工具。并发”将操作放到后台。唯一的限制是您不能直接从后台进程更新UI。
如果你需要从后台任务更新UI,你需要使用一些Android特定的类。你可以使用类“android.os”。或者AsyncTask类
是
类“Handler”可以更新UI。句柄为接收消息和可运行对象提供方法。要使用处理程序,必须继承它的子类并重写handleMessage()来处理消息。要处理Runable,可以使用post()方法;您的活动中只需要一个处理程序实例。
线程可以通过sendMessage(Message msg)或sendEmptyMessage方法发布消息。
AsyncTask
如果你有一个Activity需要下载内容或执行可以在后台完成的操作,AsyncTask允许你维护一个响应式用户界面,并将这些操作的进度发布给用户。
要了解更多信息,你可以看看这些链接。
http://mobisys.in/blog/2012/01/android-threads-handlers-and-asynctask-tutorial/
http://www.slideshare.net/HoangNgoBuu/android-thread-handler-and-asynctask