Ⅰ android handler和异步任务有什么区别
其实handler与异步任务没有可比性,您的基础还需要加强。下面这篇csdn的博客中有handler的详细介绍,
http://blog.csdn.net/androidwuyou/article/details/52601498
AsyncTask实现的原理和适用的优缺点
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
使用的优点:
简单,快捷
过程可控
使用的缺点:
在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.
Handler异步实现的原理和适用的优缺点
在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)运行并生成Message-Looper获取Message并传递给HandlerHandler逐个获取Looper中的Message,并进行UI变更。
使用的优点:
结构清晰,功能定义明确
对于多个后台任务时,简单,清晰
使用的缺点:
在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)
AsyncTask介绍
Android的AsyncTask比Handler更轻量级一些(只是代码上轻量一些,而实际上要比handler更耗资源),适用于简单的异步处理。
首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。
Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。
AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。
AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:
doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
有必要的话你还得重写以下这三个方法,但不是必须的:
onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
onCancelled() 用户调用取消时,要做的操作
使用AsyncTask类,以下是几条必须遵守的准则:
Task的实例必须在UI thread中创建;
execute方法必须在UI thread中调用;
不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
该task只能被执行一次,否则多次调用时将会出现异常;
Handler介绍
一、 Handler主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
当应用程序启动时,Android首先会开启一个主线程, 主线程为管理界面中的UI控件,进行事件分发,更新UI只能在主线程中更新,子线程中操作是危险的。这个时候,Handler就需要出来解决这个复杂的问题。由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传递)Message对象(里面包含数据), 把这些消息放入主线程队列中,配合主线程进行更新UI。
二、Handler的特点
Handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中,
它有两个作用:
(1)安排消息或Runnable 在某个主线程中某个地方执行
(2)安排一个动作在不同的线程中执行
Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.
Ⅱ 如何生动形象的理解Android Handler消息处理机制
在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中的Activity,Service,Content Provider,Broadcast Receiver(Android 4大组件)都会跑在这个Process。一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread。在这么多Thread当中,有一个Thread,称之为UI Thread。UI Thread在Android程序运行的时候就被创建,是一个Process当中的主线程Main Thread,主要是负责控制UI界面的显示、更新和控件交互。在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一个线程中运行。因此,UI Thread所执行的每一个函数,所花费的时间都应该是越短越好。而其他比较费时的工作(访问网络,下载数据,查询数据库等),都应该交由子线程去执行,以免阻塞主线程,导致ANR。那么问题来了,UI 主线程和子线程是怎么通信的呢。这就要提到这里要讲的Handler机制。
简单来说,handler机制被引入的目的就是为了实现线程间通信的。handler一共干了两件事:在子线程中发出message,在主线程中获取、处理message。听起来好像so easy,如果面试中让阐述下Handler机制,这么回答显然不是面试官想要的答案。忽略了一个最重要的问题:子线程何时发送message,主线程何时获取处理message。
为了能让主线程“适时”得处理子线程所发送的message,显然只能通过回调的方式来实现——开发者只要重写Handler类中处理消息的方法,当子线程发送消时,Handler类中处理消息的方法就会被自动回调。
Handler类包含如下方法用于发送处理消息
void handleMessage(Message msg):处理消息的方法,该方法通常用于被重写。
final boolean hasMessage(int what):检查消息队列中是否包含what属性为指定值的消息。
final boolean hasMessage(int what,Object object):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。
sendEmptyMessage(int what)发送空消息。
sendEmptyMessageDelayed(int what,longdelayMillis);指定多少毫秒之后发送空消息。
sendMessage(Message msg)立即发送消息。
sendMessageDelayed(int what,longdelayMillis);指定多少毫秒之后发送消息。
借助以上方法,就可以自由穿梭于主线程和子线程之中了。
到这里就结束了么?当然没有。要讲的东西才刚刚开始,要知道消息处理这件事,不是handler一个人在战斗,android的消息处理有三个核心类:Handler,Looper,和Message。其实还有一个MessageQueue(消息队列),但是Message Queue被封装到Looper里面了,不会直接与Message Queue打交道。
Looper的字面意思是“循环装置”,它被设计用来使一个普通线程变成Looper线程。所谓Looper线程就是循环工作的线程。在程序开发中,经常会需要一个线程不断循环,一旦有新任务则执行,执行完继续等待下一个任务,这就是Looper线程。Looper是用于给一个线程添加一个消息队列(MessageQueue),并且循环等待,当有消息时会唤起线程来处理消息的一个工具,直到线程结束为止。通常情况下不会用到Looper,因为对于Activity,Service等系统组件,Frameworks已经为初始化好了线程(俗称的UI线程或主线程),在其内含有一个Looper,和由Looper创建的消息队列,所以主线程会一直运行,处理用户事件,直到某些事件(BACK)退出。
如果,需要新建一个线程,并且这个线程要能够循环处理其他线程发来的消息事件,或者需要长期与其他线程进行复杂的交互,这时就需要用到Looper来给线程建立消息队列。
使用Looper也非常的简单,它的方法比较少,最主要的有四个:
public static prepare();为线程初始化消息队列。
public static myLooper();获取此Looper对象的引用
public static loop();让线程的消息队列开始运行,可以接收消息了。
public void quit();退出具体哪个Looper
在整个消息处理机制中,message又叫task,封装了任务携带的信息和处理该任务的handler,这个很好理解,就不做介绍了。
说了这么多,一定没听太明白。没关系,再对Handler运行机制做个总结:
子线程(无looper)借用主线程(有looper)里的Hander发送一条message到主线程,这个message会被主线程放入message queue,主线程里面有一个looper,在轮询message queue的时候发现有一条message。调用handler消息处理者,执行handlemessage方法,去处理这个message,就可以在handlemessage的方法里面更新ui。好像画面感不是太强,举个例子吧。试想有一个生产方便面的车间,这个车间有两条生产线,一条是生产面饼的,一条是生产调料包的,面饼的生产线比较先进一点,配备了一个工人叫handler,还配备了一个调料包分类循环器。这个车间能生产很多种方便面,有老坛酸菜,有泡椒凤爪,有香菇炖鸡,有红烧牛肉等等。其中方便面的面饼都是一样的,只有调料包和包装袋不一样,包装袋是根据调料包来定的。那么生产线运作起来了:工人Handler把子生产线(子线程)上的调料包(message)放到了主生产线(主线程)上的调料包分类循环器(Looper)上,通过轮询分类筛选后工人Handler确定这是一包合格的老坛酸菜味调料包,于是工人把老坛酸菜调料包和面饼放在一块(sendmessage),告诉主生产线,这是一包老坛酸菜方便面,请给这包方便面包一个老坛酸菜的包装袋(更新UI).
Ⅲ android开发中关于handler部分的困惑
这么说吧,handler是一个消息队列,其中就有这个Message 当你new了一个handler的时候同时就携带了一个Message对象!当你需要传递信息的时候直接拿就ok了。同时建议你看一下啊Handler 的机制原理
(给你列举一下算了):
andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。
Ⅳ android中我们为什么要用handler
主线程与子线程通信
Ⅳ android handler机制怎么实现自动调用函数
一、Handler的定义:
主要接受子线程发送的数据, 并用此数据配合主线程更新UI。
解释:当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。 如果此时需要一个耗时的操作,例如: 联网读取数据, 或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭"。 这个时候我们需要把这些耗时的操作,放在一个子线程中
Ⅵ Android 为什么使用Handler
在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化。有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过接收到的消息更新主UI线程的内容。
我们假设在一个UI界面上面,有一个按钮,当点击这个按钮的时候,会进行网络连接,并把网络上的一个字符串拿下来显示到界面上的一个 TextView上面,这时就出现了一个问题,如果这个网络连接的延迟过大,可能是10秒钟甚至更长,那我们的界面将处于一直假死状态,而如果这段时间超 过5秒钟的话,程序会出现异常。
这时我们会想到使用线程来完成以上工作,即当按钮被按下的时候新开启一个线程来完成网络连接工作,并把得到的结果更新到UI上面。但是,这时候又会 出现另一个问题,在Android中,主线程是非线程安全的,也就是说UI的更新只能在本线程中完成,其他线程无法直接对主线程进行操作。
为了解决以上问题,Android设计了Handler机制,由Handler来负责与子线程进行通讯,从而让子线程与主线程之间建立起协作的桥梁,使Android的UI更新的问题得到完美的解决。接下来举例来诠释Handler的基本使用方法。
Handler的工作原理
一般情况下,在主线程中我们绑定了Handler,并在事件触发上面创建新的线程用于完成某些耗时的操作,当子线程中的工作完成之后,会对Handler发送一个完成的信号,而Handler接收到信号后,就进行主UI界面的更新操作。
2
Handler与子线程协作实例
1、创建Handler实现类,在主UI所在类中的内部类
class MyHandler extends Handler {
public MyHandler() { }
public MyHandler(Looper L) {
super(L);
}
// 重写handleMessage方法,接受数据并更新UI
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//此处根据msg内容进行UI操作
}
}
2、子线程的实现
class MyThread implements Runnable {
public void run() {
Message msg = new Message();
Bundle b = new Bundle();
b.putString("cmd", "update");
msg.setData(b);
MainActivity.this.myHandler.sendMessage(msg);
//通知Handler更新UI
}
}
通过以上的两个实现,我们只需要在MainActivity中声明MyHandler实例对象就可以完成线程之间的通讯和界面的更新操作。
MyHandler myHandler = newMyHandler();
Ⅶ 能讲讲Android的Handler机制吗
Android的Handler机制是通俗讲为了互相发消息,一般是子线程给主线程发消息完成相应操作。
安卓中最常见的操作是子线程操作完事后得到数据想更新UI,安卓有规定不允许在子线程中刷新UI,所以Handler出现了。
使用和理解大致步骤。
创建全局Handler对象handler,然后在主线程中初始化它(一般在oncreate中),把它的handmessage里面的方法重写,这个方法是收到子线程发给它的消息后执行的逻辑。
在子线程中获取数据,调用handler.sendmessage,把要发的消息放在message中。message会添加到Messagequue(消息队列中,handler创建就带的)。
3.对象handler被创建和初始化的时候,系统自动会启动Handler.looper,也就是一个消息轮询器,它不断的去查看有没有消息进入到Messagequue(消息队列中),有就取出交给handler的handmessage去处理。//这段逻辑是系统自动执行,理解就行。*纯手打,不骗人~~~
Ⅷ android线程及handler的关系
handler是android特有的机制,最大的好处就是实现了Activity主线程(就是UI主线程)和其他线程(自己定义的Thread)之间的数据通信。Timer和Thread是实现多线程的,而handler是实现线程间通信的,二者很大不同,关于handler的用法
Ⅸ android中 private Handler mHandler = new Handler()是什么意识,含义是什么,谢谢啦
handler是android中为了处理异步线程更新UI的问题而出现的一个工具。
在android异步线程是不能够更新UI的,只能在主线程中更新UI。
这里的mhandler不会被你自己调用。你所要做的就是向handler中传递消息,然后handler响应你所传递来的消息。
handler会有一个消息队列,是根据你出入的消息顺序排列的,handler会依次响应消息队列里面的消息。
总之一句话,就是,当你想要在异步线程里面更新UI的时候就使用handler就好了。
Ⅹ Android中Handler的主要作用是什么通俗点,初学。
Handler的使用主要是android中无法在主线程(即UI线程)中访问网络、无法在子线程中访问UI线程元素。
一般是在子线程中访问网络,然后使用Handler发送message通知主线程处理UI更新操作