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、Thread和Looper之间的关系可以总结为:Handler是用来发送和处理消息的,它必须与一个Looper关联;Thread是消息处理的上下文,每个Thread可以有一个Looper;Looper则是在Thread中运行的消息循环,负责调度和...
System.out.println("Handler-->"+Thread.currentThread().getName()); } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if ...
一个`Handler`对象通常与特定的`Looper`和`MessageQueue`关联,`Looper`循环地从`MessageQueue`中取出消息并分发给相应的`Handler`进行处理。这样,我们可以在工作线程中执行耗时任务,然后通过`Handler`将结果发送...
本篇文章将详细探讨两种常见的异步处理方式:`AsyncTask`和`Thread`配合`Handler`,并进行对比分析。 `AsyncTask`是Android SDK提供的一种轻量级的异步任务处理机制,它主要用于短时间的后台操作,如网络请求、数据...
不过,当需要精确控制消息的处理顺序,或者需要与主线程进行复杂交互时,Handler、Thread和Looper的组合就显得尤为重要。 总结一下,Android的Handler-Thread-Looper模型是多线程通信的关键,通过Handler发送消息,...
在Android开发中,`Service`、`Thread`、`Toast`和`Handler`是四个非常重要的组件和概念,它们在创建高效、响应式的应用程序中起着关键作用。下面将详细阐述这些知识点及其相互关系。 首先,`Service`是Android中的...
1. **创建Handler实例**:首先,在主线程中创建一个`Handler`实例,这个`Handler`会与主线程的`Looper`关联。 ```java Handler handler = new Handler() { @Override public void handleMessage(Message msg) { ...
通常,Handler与Looper和Message配合使用。Looper是每个线程中的消息循环,负责接收和分发Message。主线程默认已经有一个运行的Looper,但其他线程需要手动创建和启动Looper。 在"Handler结合thread异步加载网络...
在Android开发中,Thread和Handler是两个非常关键的概念,它们用于处理线程间通信和UI更新,确保程序的运行效率和用户体验。这篇博客主要探讨了如何有效地使用Thread和Handler进行多线程操作。 首先,Thread在Java...
在Android应用开发中,线程(Thread)和Handler是实现多任务并行处理以及界面更新的关键组件。Android系统是一个单线程模型,主线程(UI线程)负责处理用户交互和绘制界面,而其他工作通常需要在后台线程中执行,以...
总结来说,"Thread_Handler_MessageDownload"项目通过实践展示了如何在Android中使用Thread进行后台操作,利用Handler和Message在工作线程与主线程之间进行高效、安全的通信,实现网络图片的异步加载。这种方法对于...
`Handler`需要与`Looper`配合工作,`Looper`是一个消息循环,它不断检查消息队列并处理其中的消息。 下面是一个简单的使用`Handler`、`Thread`和`Looper`异步加载网络图片的步骤: 1. **创建后台线程**:创建一个...
前几天看到一道面试题:Thread、Handler和HandlerThread有什么区别?,这个题目有点意思,对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),...
在Android开发中,`Handler`、`Thread`、`AsyncTask`和`HttpURLConnection`是四个非常关键的概念,它们涉及到应用程序的多线程处理、网络通信以及UI更新。接下来,我们将详细探讨这些知识点。 首先,`Thread`是Java...
在Android中,WebView通常用于加载和展示网页内容,而Thread和Handler则用于解决UI线程与后台任务之间的通信问题,避免阻塞主线程。 【知识点详解】 1. **WebView**: Android系统提供的一个可以加载网页的组件,它...
为了解决这个问题,Android提供了多种异步处理机制,其中一种常见的方式是使用`Thread`配合`Handler`来实现非UI线程执行耗时任务并更新UI。本篇将详细介绍这一方法。 首先,我们需要理解Android的线程模型。Android...
在Android开发中,`Handler`、`Thread`和`post`方法是实现UI线程与后台线程交互的重要工具。`Handler`类主要用于发送和处理消息,`Thread`用于开启新的执行线程,而`post()`方法则是`Handler`的一个关键函数,常用于...
为了解决这个问题,Android引入了Handler机制,配合Runnable对象来安全地在主线程中更新UI。以下将详细讲解这个过程。 首先,我们需要理解Android的线程模型。Android应用主要由主线程和工作线程组成。主线程负责...
`Handler`通常与`Looper`配合使用,创建一个消息循环,使得`Handler`能够接收到并处理来自其他线程的消息。`Handler`的工作原理是,当创建一个`Handler`对象时,它会与当前线程的`Looper`关联,然后可以发送`Message...
在Android开发中,线程和线程池是处理异步任务的重要工具,而Handler则是用于在主线程和子线程之间通信的关键组件。本篇文章将深入探讨这些概念,以及它们在实际应用中的用法。 首先,让我们理解什么是线程。线程是...