android里面对于异步消息的处理,提供了一套Handler的实现方案。Handler有很多适宜的应用和微妙之处,使它在和Thread以及Service等一起使用的时候达到很好的效果。
一. Handler与Thread的区别。
Handler与调用者处于同一线程,如果Handler里面做耗时的动作,调用者线程会阻塞。Android UI操作不是线程安全的,并且这些操作必须在UI线程中执行。Android提供了几种基本的可以在其他线程中处理UI操作的方案,包括Activity的runOnUiThread(Runnable),View的post以及1.5版本的工具类AsyncTask等方案都采用了Handler,Handler的post对线程的处理也不是真正start一个新的线程,而是直接调用了线程的run方法,这正是google煞费苦心搞一套Handler的用意。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startThread();
// sendMessage();
SystemClock.sleep(2000);
setContentView(R.layout.main);
}
public void startThread() {
mThread.start();
}
public void sendMessage() {
MHandler mHandler = new MHandler();
Message msg = mHandler.obtainMessage();
msg.sendToTarget();
}
class MHandler extends Handler {
public MHandler() {
}
public MHandler(Looper l) {
super(l);
}
@Override
public void handleMessage(Message msg) {
int count = 0;
while (count++ < Integer.MAX_VALUE) {
Log.d(TAG, "Rintail");
}
}
}
Thread mThread = new Thread() {
@Override
public void run() {
int count = 0;
while (count++ < Integer.MAX_VALUE) {
Log.d(TAG, "Rintail");
}
}
};
二.Handler对于Message的处理不是并发的。
一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的。但是如果用不同的Looper则能达到并发的目的。Service中,onStart的执行也是阻塞的。如果一个startService在onStart执行完成之前,再次条用startService也会阻塞。如果希望能尽快的执行onStart则可以在onStart中使用handler,因为Message的send是非阻塞的。如果要是不同消息的处理也是并发的,则可以用不同的Looper实例化Handler。
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
sendMessageWithLooper();
//sendMessage();
}
public void sendMessage() {
MHandler mHandler = new MHandler();
Message msg = mHandler.obtainMessage();
msg.sendToTarget();
}
public void sendMessageWithLooper() {
HandlerThread ht = new HandlerThread("Rintail");
ht.start();
MHandler mHandler = new MHandler(ht.getLooper());
Message msg = mHandler.obtainMessage();
msg.sendToTarget();
}
class MHandler extends Handler {
public MHandler() {
}
public MHandler(Looper l) {
super(l);
}
@Override
public void handleMessage(Message msg) {
Log.d(TAG, "first");
while (true) {
if (false)
break;
}
Log.d(TAG, "second");
}
};
class MyThread extends Thread {
@Override
public void run() {
Log.d(TAG, "first");
while (true) {
if (false)
break;
}
Log.d(TAG, "second");
}
};
三、资源回收。
向Handler对象发送类似new Message ()形式的空Message可以达到清空Message的目的,这种做法与getLooper().quit()的做法是一样的。如果利用的资源较多,应及时清理。
分享到:
相关推荐
本实例将深入探讨如何利用Handler在两个Activity之间传递数据和触发事件。 一、Handler基础 Handler是Android中的一个关键组件,它主要用于处理由Looper对象分发的消息(Message)。当在主线程(UI线程)中创建一个...
通常,我们会在主线程(UI线程)中创建一个Handler实例,这样处理的消息就会在这个线程中执行,这对于更新UI是必要的,因为Android只允许主线程操作UI。 `Runnable`是一个接口,它定义了一个单个方法`run()`. 任何...
- 在SplashActivity的onCreate方法中,初始化Handler实例。 - 实现Runnable接口,重写run方法。在run方法内,执行你需要在3秒后完成的任务,比如关闭Splash Screen或启动主Activity。 - 使用Handler的`...
Handler是Android中处理消息和调度任务的对象,它通常与Looper和Message配合使用,实现线程间的通信。主线程中默认有一个Looper对象,负责接收和分发Message,而Handler则用来发送Message到Looper,从而实现主线程的...
在“androidHandler测试的demo”中,我们可以预期包含以下内容: 1. 创建自定义`Handler`子类:这个子类可能重写了`handleMessage(Message msg)`方法,根据`msg.what`的值执行不同的操作,比如更新UI元素或执行特定...
总结起来,Handler是Android中进行线程间通信的重要工具,合理使用它可以有效地提升应用的性能和用户体验。在实际开发中,应结合使用Handler、Looper和Thread,以实现高效的多线程编程。在后续章节,我们将更深入地...
在Android开发中,`Handler`是一个至关重要的组件,它用于处理与线程通信相关的任务,尤其是在主线程(UI线程)和工作线程之间。`Handler`、`Looper`和`Message`三者共同构成了Android的消息传递机制。下面将详细...
Android中的Handler机制是Android应用开发中的核心组件之一,它与多线程、消息队列紧密相连,用于实现线程间的通信和任务的调度。Handler允许您将任务发送到特定的线程的队列中执行。一个典型的使用场景是在非UI线程...
【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...
本文将深入探讨Android中的日期类以及Handler的使用,这两个概念在实际应用中有着广泛的应用。 首先,让我们了解一下Android中的日期类。在Java和Android中,日期类主要用于处理日期和时间相关的操作。最常用的日期...
以上就是Android Handler机制的基础实例和使用方法。理解并熟练运用Handler,可以有效地在不同线程之间协调工作,提高应用性能和用户体验。在实际开发中,还需要结合AsyncTask、IntentService等其他工具灵活运用,以...
在Android应用开发中,Fragment和...正确理解和使用Handler能帮助开发者构建高效、稳定的Android应用程序。在实际开发中,还应结合其他通信方式,如Interface回调、EventBus、LiveData等,根据场景选择最适合的方法。
### Android开发工程师面试题之Handler详解 在Android开发过程中,Handler是进行线程间通信的重要机制之一,尤其在实现异步任务更新UI等场景中扮演着关键角色。本篇文章将围绕Handler的工作原理、核心组件及其实现...
AsyncTask、Handler、Looper和Thread池等工具的使用,将在实例中得到详解。 8. **数据库SQLite**: 存储和检索本地数据时,SQLite是常用的选择。实例源码会教授如何创建数据库,执行SQL查询,以及如何使用...
在我们的实例中,我们可能创建一个新线程来执行后台任务,然后使用`Handler`和`Message`将结果传递回主线程进行UI更新。 下面是一个简单的实例: 1. 创建一个`Handler`对象,通常在主线程中: ```java Handler ...
在Android开发中,`Handler`是一个至关重要的组件,它用于在主线程中处理来自其他线程的消息,确保UI更新操作的正确执行。本项目“Android源代码:HandlerDemo”将深入探讨`Handler`机制及其在多线程环境中的应用。 ...
在Android系统中,Handler、Message和Looper构成了一个关键的异步通信机制,即Handler消息处理机制。这个机制允许Android应用程序在不同的线程间传递消息,处理UI更新等操作,是多线程编程中的重要组成部分。下面...
使用`Handler`的`sendMessage(Message msg)`或`sendMessageDelayed(Message msg, long delayMillis)`方法将`Message`发送到消息队列。这些方法会将消息添加到与`Handler`关联的`Looper`的消息队列中。 5. **Looper...
7. **多线程与并发**:Android应用需要处理复杂的多线程场景,源码可能包含Handler、AsyncTask、Thread、Service等的使用,以实现后台任务和避免主线程阻塞。 8. **权限管理**:随着Android系统对权限管理的加强,...
总的来说,通过这个实例,你不仅学会了如何在Android Studio中创建一个简单的计时器应用,还掌握了Handler的基本用法。理解并熟练掌握Handler对于进行Android应用开发至关重要,因为它是处理主线程与子线程通信、...