Android Handler讲解&介绍&代码

合集下载

Android中的Handler,以及用Handler延迟执行

Android中的Handler,以及用Handler延迟执行

Android中的Handler,以及⽤Handler延迟执⾏项⽬中遇到⼀个情况,先⽣成⽂件再上传;但有时候发出指令后上传会不成功,需要再发⼀次指令⽅能上传。

猜想是由于⽂件还没⽣成就执⾏「上传」指令了。

想到要延时。

Android中单纯⽤currentThread.sleep()⽅法好像是不⾏的,要⽤「Handler」。

⽤以下代码成功实现延时:new Handler().postDelayed(new Runnable(){public void run() {//显⽰dialog}}, 5000); //5秒补充:API是这么解释的:「There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.」参考:---------------------Mar.26,2014分割线-----------------------今天是Mar.26,2014,从Mars⽼师的视频⾥摘录⼀些Handler的东西:1.Handler负责把消息对象加⼊到消息队列尾部;Looper是⼀个「循环器」,不停地从消息队列头部取出消息对象。

如果消息队列中没有消息对象中,Looper处于等待状态,有则取出。

Looper调⽤Handler的handleMessage()⽅法对消息对象进⾏处理。

好吧,偷懒截个图吧:摘⾃SE02E06的视频2.SE02E07,Handler(上)讲得是,他打算实现:通过Handler实现线程间通信在主线程中实现Handler的HandleMessage()⽅法在WorkerThread中通过Handler发送消息 于是他在MainActivity中写了⼀个NetworkThread extends Thread,在⾥⾯的run()⽅法中他先让线程sleep两秒钟(模拟访问⽹络),然后定义⼀个String s,尝试把s赋值给前⾯定义好的textView中,⽤「textView.setText(s);」,他提到这样是不⾏的,因为「只能在UI线程MainThread中操作控件。

android handlerthread用法

android handlerthread用法

android handlerthread用法Android HandlerThread是Android开发中常用的多线程处理工具。

它能够在后台线程中执行任务,并通过Handler与UI线程进行通信。

本文将详细介绍HandlerThread的用法,以及如何使用它来实现多线程任务处理。

一、什么是HandlerThread?HandlerThread是Android中的一个类,继承自Thread,并实现了Looper接口。

它在后台线程中提供了一个消息循环机制,可以用来处理耗时的任务。

二、使用HandlerThread的步骤1. 创建HandlerThread实例首先,我们需要创建一个HandlerThread的实例,并给它一个有意义的名称。

例如,可以创建一个名为"BackgroundThread"的HandlerThread 实例:javaHandlerThread handlerThread = newHandlerThread("BackgroundThread");2. 启动HandlerThread接下来,我们需要调用HandlerThread的start方法来启动它的线程:javahandlerThread.start();3. 创建Handler然后,我们可以通过HandlerThread的getLooper方法获得一个Looper 实例,并将其用于创建一个Handler对象:javaHandler handler = new Handler(handlerThread.getLooper());通过这个Handler,我们可以在后台线程中发送和处理消息。

4. 发送消息现在我们可以在UI线程中通过Handler发送消息到后台线程中进行处理。

例如,我们可以发送一个Runnable对象到后台线程中执行:javahandler.post(new Runnable() {@Overridepublic void run() {在后台线程中执行耗时任务...}});5. 处理消息在HandlerThread的内部实现中,它会不断地从消息队列中取出消息并处理。

handler延迟消息原理

handler延迟消息原理

handler延迟消息原理1. Handler的基本原理在Android中,主线程(也称为UI线程)是用来处理与用户交互、UI 操作相关的任务的线程。

Android系统采用消息循环机制来实现主线程的任务处理。

消息循环是一种事件驱动的机制,主要包括消息队列和消息处理器两部分。

消息队列保存了所有需要处理的消息,每个消息包含一个目标Handler对象和要执行的任务。

主线程通过Looper对象来不断轮询消息队列,当有消息时,将其投递给目标Handler对象进行处理。

Handler对象是消息处理器,用于接收和处理消息。

一个Handler可以与一个特定的线程和Looper绑定,也可以独立于任何线程使用。

Handler可以用来发送消息(消息投递给消息队列)、处理消息(从消息队列中取出并处理消息)、删除消息(将消息从消息队列中移除)。

2.延迟消息的实现Handler中的postDelayed(方法可以用来发送延迟消息,即将消息延迟一定时间后再投递到消息队列中。

该方法有两个参数,第一个参数是要执行的任务(Runnable对象),第二个参数是延迟的时间。

在发送延迟消息时,Handler会根据当前时间加上延迟时间计算出一个绝对时间,然后将该消息插入到消息队列中的适当位置。

3.延迟消息的原理延迟消息的原理可以通过源码分析来解释。

在Handler的postDelayed(方法内部,会创建一个Message对象,并计算出消息的触发时间。

```public boolean postDelayed(Runnable r, long delayMillis)return sendMessageDelayed(getPostMessage(r), delayMillis);}Message getPostMessage(Runnable r)Message m = Message.obtain(;m.callback = r;return m;}boolean sendMessageDelayed(Message msg, long delayMillis)if (delayMillis < 0)delayMillis = 0;}}```在sendMessageDelayed(方法中,调用了sendMessageAtTime(方法来将消息插入到消息队列中的适当位置。

alarmmanager setexact 方法中的handler参数

alarmmanager setexact 方法中的handler参数

alarmmanager setexact 方法中的handler参数在Android开发中,我们经常会使用到AlarmManager类来实现定时任务的功能。

其中,setExact方法是AlarmManager类中的一个重要方法,它允许我们指定精确的触发时间来执行任务。

在该方法中传递的参数handler,在文档中并未详细解释其含义。

本文将解析AlarmManager类的setExact方法中的handler参数的作用。

AlarmManager是Android提供的一个系统级别的服务,允许我们在指定的时间点触发某些操作。

setExact方法被广泛用于需要精确定时的任务,它会在指定的时间点唤醒设备并执行指定的操作。

其具体用法如下:```javaAlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);Intent intent = new Intent(this, MyBroadcastReceiver.class);PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + interval, pendingIntent);```在上述代码中,我们通过获取AlarmManager的实例,并创建一个待触发的Intent。

随后,我们使用setExact方法来指定触发的时间点,以及通过PendingIntent来指定触发后需要执行的操作。

在setExact方法中,有一个名为handler的参数。

根据文档,handler 是一个用于处理闹钟触发的事件的Handler对象。

android handler延迟消息原理

android handler延迟消息原理

android handler延迟消息原理
Android中的Handler主要用于实现线程间通信,其延迟消息可以通过调用 postDelayed() 方法来实现。

其原理为创建一个 Message 对象,并将其加入到消息队列中,并在延迟的时间后处理该消息。

在Handler中,通过调用 postDelayed() 方法来提交一个消息,其中第一个参数为 Runnable 对象,在消息队列中的消息会被传入其run() 方法中执行,第二个参数为延迟时间,单位为毫秒。

当延迟时间到达时,该消息会被加入到消息队列中。

当Looper循环检测到消息队列中有消息时,会取出该消息并调用该消息所属 Handler 的 handleMessage() 方法进行处理。

在handleMessage() 方法中,根据不同消息类型进行不同的处理,例如更新UI等操作。

通过使用 Handler 的延迟消息机制,可以在需要延迟执行任务的情况下,实现非常方便的实现方式。

例如,延迟显示某个操作的结果提示,或者延迟执行某段耗时的计算等操作,通过这种方式,可以更为灵活的控制任务执行的时间。

AndroidHandler机制(三):Handler机制与管道Pipe机制

AndroidHandler机制(三):Handler机制与管道Pipe机制

AndroidHandler机制(三):Handler机制与管道Pipe机制在深⼊系统的学习Handler的时候,我们接触到了Looper之所以死循环不会导致CPU使⽤率过⾼,是因为使⽤了Linux下的pipe和epoll机制。

Android的应⽤层通过Message.java实现队列,利⽤管道和epoll机制实现线程状态的管理,配合起来实现了Android主线程的消息队列模型。

对Handler,我们在之前整理了如下内容,也上对Handler的机制有了相当程度的了解:同时为了更进⼀步的了解Handler机制,我们整理了Epoll机制的相关基本知识:本⽂我们讲述⼀下Android的Handler机制为何使⽤管道。

⼀、管道概述管道,其本质是也是⽂件,但⼜和普通的⽂件会有所不同:管道缓冲区⼤⼩⼀般为1页,即4K字节。

管道分为读端和写端,读端负责从管道拿数据,当数据为空时则阻塞;写端向管道写数据,当管道缓存区满时则阻塞。

在Handler机制中,Looper.loop⽅法会不断循环处理Message,其中消息的获取是通过 Message msg = queue.next(); ⽅法获取下⼀条消息。

该⽅法中会调⽤nativePollOnce()⽅法,这便是⼀个native⽅法,再通过JNI调⽤进⼊Native层,在Native层的代码中便采⽤了管道机制。

⼆、Handler为何使⽤管道?我们可能会好奇,既然是同⼀个进程间的线程通信,为何需要管道呢?我们知道线程之间内存共享,通过Handler通信,消息池的内容并不需要从⼀个线程拷贝到另⼀个线程,因为两线程可使⽤的内存时同⼀个区域,都有权直接访问,当然也存在线程私有区域ThreadLocal(这⾥不涉及)。

即然不需要拷贝内存,那管道是何作⽤呢?Handler机制中管道作⽤就是当⼀个线程A准备好Message,并放⼊消息池,这时需要通知另⼀个线程B去处理这个消息。

handlemessage基本用法

handlemessage基本用法

handlemessage基本用法
`Handler` 的基本用法涉及到Android中的消息机制,主要用于线程间的通信。

以下是它的基本用法步骤:
1. 创建Handler对象:通常在主线程中创建一个Handler实例,因为Handler与创建它的线程的Looper紧密相关。

2. 定义消息:通过创建Message对象并设置其属性,如目标Handler、要执行的代码(Runnable)或要传递的数据。

3. 发送消息:使用Handler的`sendMessage(Message msg)`方法将消息发送到消息队列中。

如果需要立即处理消息,可以使用`handleMessage(Message msg)`方法。

4. 处理消息:重写Handler的`handleMessage(Message msg)`方法来定义当消息被处理时应该执行的操作。

5. 消息循环:每个Looper会不断从其消息队列中读取并处理消息,直到队列为空或者调用了`quit()`或`quitSafely()`方法。

这种机制允许开发者在不同的线程间传递和处理信息,而不必担心线程安全问题,因为所有的处理操作都会在创建Handler的那个线程中执行。

3、简述handler、looper、messagequeue的工作原理。

3、简述handler、looper、messagequeue的工作原理。

3、简述handler、looper、messagequeue的工作原理。

handler、looper、messagequeue是Android中实现线程间通信的重要组件。

Handler是Android中的一个类,它主要用于实现线程间通信。

它接受来自其他线程的Message或Runnable对象,并将其放入MessageQueue中。

Handler内部有一个关联的Looper对象,它负责不断地从MessageQueue中取出消息并交给相应的Handler进行处理。

Looper是Android中的一个类,它与每个线程关联,通过不断地循环来处理消息队列中的消息。

当调用Looper类的静态方法prepare()时,会创建一个Looper对象并关联当前线程。

然后调用Looper对象的静态方法loop(),该方法会使Looper对象不断地从MessageQueue中取出消息并进行处理。

当消息队列为空时,Looper会进入休眠状态,直到有新的消息到达。

MessageQueue是一个存放待处理消息的消息队列,它与每个线程关联。

当通过Handler发送消息时,消息会被加入到MessageQueue的尾部。

Looper会不断地从队列的头部取出消息,并根据消息中的Handler对象进行处理。

整体工作流程如下:1. 在主线程中创建一个Handler,并关联当前线程的Looper。

2. 在其他线程中通过Handler发送消息或者Runnable任务。

3. 发送的消息或任务会被加入到当前线程的MessageQueue中。

4. Looper会不断地从MessageQueue中取出消息进行处理。

5. 取出的消息会交给相应的Handler进行处理。

通过Handler、Looper和MessageQueue的组合使用,可以实现多线程之间的通信和任务调度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

* Handler的定义:
* 主要接受子线程发送的数据, 并用此数据配合主线程更新UI。

当应用程序启动时,* Android首先会开启一个主线程(也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说,
* 你要是点击一个Button ,Android会分发事件到Button上,来响应你的操作。

* 如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,
* 如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示"强制关闭"。

* 这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,
* 也就是说,更新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对象到主线程队列中,当需要在不同于主UI线程中执行则需要配合HandlerThread进行使用:
* HandlerThread handlerThread = new HandlerThread("myHandlerThread");
* handlerThread.start();
* handler = new Handler(handlerThread.getLooper());* sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.
* @author xiaoshuang
*
*/
public class HandlerActivity extends Activity {
private TextView textView;
private MyHandler myHandler;
private Button button;
private ProgressBar progressBar;
private MyThread m=new MyThread();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(yout.main);
textView=(TextView)findViewById(R.id.text);
button=(Button)findViewById(R.id.startButton);
progressBar=(ProgressBar)findViewById(R.id.bar);
progressBar.setMax(100);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
myHandler=new MyHandler();
new Thread(m).start();
System.out.println("onCreate--The Thread is: "+Thread.currentThread().getId());
}
});
}
//在对UI进行更新时,执行时所在的线程为主UI线程
class MyHandler extends Handler{//继承Handler类时,必须重写handleMessage方法public MyHandler(){
}
public MyHandler(Looper l){
super(l);
}
@Override
public void handleMessage(Message msg) {//执行接收到的通知,此时执行的顺序是按照队列进行,即先进先出
System.out.println("Handler--The ThreadId is: "+Thread.currentThread().getId());
super.handleMessage(msg);
Bundle b=msg.getData();
String textStr0=textView.getText().toString();
String textStr1=b.getString("textStr");
HandlerActivity.this.textView.setText(textStr0+" "+textStr1);//更改TextView中的值
int barValue=b.getInt("barValue");HandlerActivity.this.progressBar.setProgress(barValue);//更改进度条当中的值
}
}
//该线程将会在单独的线程中运行
class MyThread implements Runnable{
int i=1;
@Override
public void run() {
while(i<11){
System.out.println("Thread--The ThreadId is: "+Thread.currentThread().getId());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg=new Message();
Bundle b=new Bundle();
b.putString("textStr", "线程运行"+i+"次");
b.putInt("barValue", i*10);
i++;
msg.setData(b);
HandlerActivity.this.myHandler.sendMessage(msg);//通过sendMessage向Handler发送更新UI的消息
}
}
}
}
/***。

相关文档
最新文档