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
相关推荐
因此,当需要执行网络请求、数据库操作或大计算量的任务时,我们需要在其他线程(非UI线程)中执行。 接着,我们来看`Thread`类,它是Java中的基础线程类。通过创建`Thread`对象并调用其`start()`方法,可以开启一...
这个"Android_Handler的线程队列Demo"旨在演示如何有效地利用Handler来处理线程间的通信,特别是主线程(UI线程)与工作线程之间的交互。下面我们将深入探讨相关知识点。 首先,了解Handler的基本概念。Handler是...
在Android开发中,更新UI(用户界面)是一个常见的任务,但是由于Android的主线程(也称为UI线程)是负责处理用户交互和绘制界面的,所以直接在后台线程进行UI更新可能会导致程序崩溃或者界面卡顿。为了解决这个问题...
由于Android系统规定所有的UI操作必须在主线程(也称为UI线程)中执行,因此当需要在后台子线程进行耗时操作(如网络请求、数据库操作等)时,就需要一种机制来实现与UI线程的通信,以便更新UI。Looper和Handler正是...
理解Android的UI线程机制至关重要,因为错误地在非UI线程中操作UI组件会导致应用崩溃或出现不一致的用户界面。下面将详细阐述Android UI线程的工作原理,以及如何在子线程中安全地访问UI。 一、Android UI线程 1. ...
而在Android中,通常会使用Handler, MessageQueue和Looper的组合来实现UI线程与工作线程之间的通信。 具体步骤如下: 1. **创建后台线程**:首先,我们需要创建一个无界面的UI线程,它会在后台运行,执行计算或其他...
例如,我们可以在子线程中使用 Looper.prepare() 方法来准备消息队列,然后使用 Looper.loop() 方法来启动消息循环。在子线程中,我们可以使用 Handler 来发送和处理消息。 需要注意的是,在 Android 中,子线程不...
总结来说,这个项目展示了如何巧妙地使用`Handler`来处理线程间的通信,尤其是在避免网络请求的情况下,通过本地数据实现图灵机器人的对话功能。这种设计对于离线环境或者网络不稳定的情况非常有用,提高了应用的...
这个"testmfc"可能就是一个演示如何在MFC中使用工作线程和UI线程的项目。通过分析和运行这个项目,开发者可以深入理解线程间的交互和异步编程的概念,这对于编写高效、响应的GUI程序至关重要。 总的来说,工作线程...
默认情况下,只有主线程有Looper,如果你需要在其他线程中使用Handler,必须先调用`Looper.prepare()`初始化Looper,然后用`Looper.loop()`启动循环。 3. **Message(消息)**:Message是实际承载数据的对象,用于...
每个线程默认没有Looper,所以在新的线程中使用Handler时,需要先调用`Looper.prepare()`初始化,然后用`Looper.loop()`启动消息循环。 7. **使用Handler的最佳实践**: - 当需要从工作线程向主线程发送消息时,应...
在Android应用开发中,UI线程(也称为主线程)负责处理用户界面的交互,而后台线程则用于执行耗时操作,如网络请求、数据库操作等,以避免阻塞UI,保证用户界面的流畅性。当后台线程完成耗时操作后,通常需要将结果...
在MainActivity中,我们创建了一个子线程,并在子线程中使用Handler对象来更新UI。我们首先调用Thread.sleep方法来模拟一些耗时操作,然后使用Handler对象的post方法来更新UI。在post方法中,我们传入了一个Runnable...
6. **注意事项**:由于Handler主要在主线程中使用,因此对于耗时的操作,不应在`Runnable`的`run()`方法或`handleMessage()`方法中执行,以免阻塞UI线程。这些操作应该放在子线程中处理,然后通过Handler更新UI。 ...
Handler创建在UI线程,它发送消息到Looper队列,Looper在UI线程中循环读取并分发消息,从而允许非UI线程更新UI。 4. **AsyncTask**:Android提供的一种轻量级异步任务类,用于在后台线程执行任务并在完成时更新UI。...
本示例中的"Handler实现图片播放"是一个基础的实践,它利用了Android的消息处理机制来控制UI线程与后台线程之间的通信。Handler是Android中的一个关键组件,用于在不同线程间传递消息和执行任务。现在,我们详细探讨...
`MessageQueue`负责存储待处理的消息,而`Looper`则不断地从队列中取出消息,交给相应的`Handler`处理。在`Looper`的`loop()`方法中,有一个无限循环,不断地调用`next()`方法获取并分发消息。 4. 源码分析 `...
通常,主线程(UI线程)中有一个默认的Looper在后台不断循环地检查Message队列,一旦发现有新消息,就会调用Handler的`handleMessage()`方法来处理这些消息。这样,我们就可以在子线程中生成Message,通过Handler将...
在Android应用开发中,Handler是实现线程间通信的关键组件,尤其在涉及到UI更新时,它的作用尤为重要。本文将深入探讨“Android Handler定时更新UI”的相关知识点,以及如何使用CounterDemo来实现这一功能。 首先,...
Handler是Android中处理消息和线程通信的关键工具,它可以在主线程中更新UI,避免了线程同步的问题。通常,我们会创建一个Runnable对象,在其run()方法中改变ViewPager的当前页,并通过postDelayed()将其重新放入...