Handler是Android中非常重要的类之一,通过Handler可以实现主线程的延时操作和线程之间的通信,通过在子类中的Handle、和Looper可以很轻松的实现一个请求队列。
在写代码之前首先简要的说一下 Handler、Looper、MessageQuene之间的关系。
每一个线程最多有一个Looper、一个Looper里边含有一个MessageQuene。
Handler每次将消息发送到MessageQuene中,Looper用过一个死循环不断的从MessageQuene中获取消息,获取后,根据Message的target分发给对应的Handler进行处理。
下边是我写的一个通过Handler和Looper实现的请求队列:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
package com.hou.looper;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
public class DemoLooperActivity extends Activity {
private MyThread myThread = new MyThread();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
/*********** 模拟两个任务 ***********/
postToNoneUIThread( new Runnable() {
@Override
public void run() {
try {
Log.e( "" , "5 start" );
Thread.sleep( 5000 );
Log.e( "" , "5 end" );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
postToNoneUIThread( new Runnable() {
@Override
public void run() {
try {
Log.e( "" , "1 start" );
Thread.sleep( 1000 );
Log.e( "" , "1 end" );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
/*********** 模拟两个任务OVER ***********/
}
public void runOnNoneUIThread(Runnable r) {
new Thread(r).start();
}
/**
* 放入到子线程队列中
* */
public void postToNoneUIThread(Runnable r) {
// 执行到这里的时候,子线程可能尚未启动,等待子线程启动,等待的时间会很短,
while (myThread.handler == null ) {
}
myThread.handler.post(r);
myThread.handler.sendEmptyMessage( 100 );
}
/**
* 可以设计为网络请求队列
* */
class MyThread extends Thread {
{
start(); // 类加载完成后直接启动
}
private Handler handler;
@Override
public void run() {
while ( true ) {
Looper.prepare(); // 创建该线程的Looper对象
handler = new Handler(Looper.myLooper()) {
public void handleMessage(android.os.Message msg) {
Log.i( "handleMessage" , "" + msg.what);
};
};
Looper.loop(); // 这里是一个死循环
// 此后的代码无法执行
}
}
}
} |
转自:http://www.cnblogs.com/ihou/archive/2012/08/28/2660655.html
相关推荐
在android开发中,一说起线程的使用,...这样创建的handler是在主线程即UI线程下的Handler,即这个Handler是与UI线程下的默认Looper绑定的。Looper是用于实现消息队列和消息循环机制的。因此,如果是默认创建Handler
些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。 但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI...
Handler的最常见应用场景之一便是通过Handler在子线程中间接更新UI。Handler的作用主要有两个:一是发送消息;二是处理消息,它的运作需要底层Looper和MessageQueue的支撑。MessageQueue即消息队列,它的底层用...
每个Handler对象与创建它的线程相关联,并且每个...由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。 通过Runnable在子线程中更新界面的例子 在onCreate中创建Handler 代码如下:p
一、问题:在Android启动后会在新进程里创建一个主线程,也叫UI线程(非线程安全)这个线程主要负责监听屏幕点击事件与界面绘制。当Application需要进行耗时操作如网络请求等,如直接在主线程进行容易发生ANR错误。...
Handler在android里负责发送和处理消息。它的主要用途有(或者是干什么的): 1)执行计划任务,按计划(定时)发送... 2)线程间通信,把从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决Android应用中多线程的问题,在Android中不 允许Activity新启动的线程访问该Activity里的UI组件,这样会导致新启动的线程无法改变UI...
1.什么是handler? Handler是Android SDK来处理异步消息的核心类。...可以通过Handler将Message和Runnable对象发送到该Handler所关联线程的MessageQueue(消息队列)中,然后该消息队列一直在循环拿出一个Message,对其
1.Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。 2.Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper(从Message Queue...
由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题。为了解决这...
android 的service和activity是运行在UI主线程的。在android线程中,只有主线程即UI线程有自己的默认的消息队列。子线程需要创建自己的消息队列,并把消息发给队列,并循环起来,发给handler处理。
Android中除了UI线程(主线程),创建的工作线程默认是没有消息循环和消息队列的。如果想让该线程具有消息队列和消息循环,并具有消息处理机制,就需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用...
当子线程中进行耗时操作后需要更新UI时,通过Handler将有关的UI操作切换到主线程中执行。 四要素: Message(消息):需要被传递的消息,其中包含了消息标识(what),消息处理数据和处理对象(arg1,arg2,obj),发送...
如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。onEventAsync:事件处理会在单独的线程中执行,主要用于在后台线程中执行...
CommonUtils ...该框架 支持文件上传 下载 get post 同步,缓存等一些操作,不在主线程中操作,只在主线程中请求接口,在子线程中请求数据,在handler 中刷新UI。 增加 get方式请求 数据,在handler中刷
在讲完Looper,Handler和HandlerThread一章之后,一位学生问我们如何将流数据(从传感器)从后台线程传递回主线程... 后台线程只是将消息转储到队列中,而不用担心它们是否被足够快地读取。 如果UI线程不能足够快地处
这个UI线程是在应用第一次启动时开启的,也称之为主线程(Main Thread),该线程专门用来操作UI组件,在这个UI线程中我们不能进行耗时操作,否则就会出现ANR(Application Not Responding)现象。如果我们在子线程中去...
使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。 MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义...
熟悉开发的朋友都知道在子线程中默认是无法创建Handler的,这是因为子线程中不存在消息队列。当需要创建一个与子线程绑定的Handler时,标准代码如下: class LooperThread extends Thread { public Handler ...
通过看源码发现,post这个方法是把任务r转成一个message放进了handler所在的线程中的messageQueue消息队列中,并且是立刻发送的消息,这样它既不是异步的也不是延时的,所以问题来了: 1. 它和sendMessage()有什么...