一:Handler
Handler在android里负责发送和处理消息。它的主要用途有:
1)按计划发送消息或执行某个Runnanble(使用POST方法);
2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback) 可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个 Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以 sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)
注意点:mHandler.post(mRunnable); 执行了run()方法 并没有执行Thread的start()方法开启一个新的线程
所以这种方式不适合比较耗时的操作 会堵塞主线程 UI message队列
另外 mHandler.removeCallbacks(mRunnable); 该行代码如果注释掉会发现即使退出该Acitivity也会继续执行线程的run()
方法 所以这里需要注意
二:HandlerThread
HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。这个Looper其实就是对消息队列以及队列处理逻辑的封装,简单说就是 消息队列+消息循环。
当我们需要一个工作者线程,而不是把它当作一次性消耗品,用过即废弃的话,就可以使用它。
示例:
HandlerThread handlerThread = new HandlerThread("threadone");
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper());
mHandler.post(mRunnable);
这样每次post将在HandlerThread的消息队列里执行;
注意点:
这里需要handlerThread.start()先启动线程 才能 handlerThread.getLooper() 获取当前线程的Looper
通过HandlerThread的run方法可以发现这里启动的是一个新线程 虽然不能直接操作UI 但可以通过Message发送消息来进行操作。这样可以处理一些比较耗时操作。
三:AsyncQueryHandler
这个类继承了Handler 实现了 ContentProvider处理相关的一些操作的异步方式
与其说这个类提供给我们一个处理ContentProvider的方法 我觉得这更给我们提供了一个处理异步的方案
若我们不用AsyncQueryHandler,直接在UI 线程调用ContentResolve去操作数据库比如查询,若你的数据库的数据很少还好,若很多,就会出现ANR了。一般解决ANR,就是开 thread去解决。让UI线程知道何时查询完毕,可以更新UI将查询的结果表现出来
首先分析一下 AsyncQueryHandler 这个类
他的基本策略如下:
1. 当你实例化一个AsyncQueryHandler类时(包括其子类...),它会单件构造一个线程WorkerHandler,这个线程里面会构建一个消息循环。
2. 获得该消息循环的指针,用它做参数实例化另一个Handler类,该类为内部类。至此,就有了两个线程,各自有一个Handler来处理消息。
3. 当调用onXXX的时候,在XXX函数内部会将请求封装成一个内部的参数类,将其作为消息的参数,将此消息发送至另一个线程。
4. 在该线程的Handler中,接受该消息,并分析传入的参数,用初始化时传入的ContentResolver进行XXX操作,并返回Cursor或其他返回值。
5. 构造一个消息,将上述返回值以及其他相关内容绑定在该消息上,发送回主线程。
6. 主线程默认的AsyncQueryHandler类的handleMessage方法(可自定义,但由于都是内部类,基本没有意义...)会分析该消息,并转发给对应的onXXXComplete方法。
7. 用户重写的onXXXComplete方法开始工作。
四:ExecutorService
JAVA线程池,获取线程执行:
1.建立ExecutorService线程池
ExecutorService executorService = Executors.newCachedThreadPool();
2.execute(Runnable对象)方法
分享到:
相关推荐
Android 多线程Handler/Message机制详解 Android 多线程机制是 Android 应用程序中最重要的组件之一,它允许应用程序在后台执行一些操作,而不影响用户的交互体验。在 Android 中,多线程机制是基于 Handler 和 ...
SPI Handler/Driver是AUTOSAR标准的一部分,负责处理串行外设接口(SPI)的通信。 SPI Handler/Driver的作用 SPI Handler/Driver是AUTOSAR标准中的一个组件,负责处理SPI总线上的数据传输。SPI是一种串行通信协议...
SPI Handler/Driver是AUTOSAR(AUTomotive Open System ARchitecture)标准中的一部分,主要针对智能驾驶和车辆标准。SPI(Serial Peripheral Interface)是一种常见的串行通信接口,用于微控制器与外部设备之间的...
### 关于AUTOSAR SPI Handler/Driver的要求解析 #### 标题解读:AUTOSAR-SRS-SPIHandlerDriver 此文档标题明确了文档的核心内容——针对AUTOSAR平台中SPI(Serial Peripheral Interface)Handler/Driver的具体需求...
src/client/linux/handler/exception_handler_test.cc src/client/mac/handler/exception_handler_test.cc src/client/solaris/handler/exception_handler_test.cc src/processor/testdata/test_app.cc 首先...
在AUTOSAR(AUTomotive Open System ARchitecture)框架中,SPI Handler/Driver是实现SPI通信的关键组件,负责处理与SPI外设的交互。 此文档“Specification of SPI Handler/Driver”是AUTOSAR Classic Platform...
/ handler / mxCellHighlight 315 已转换 / handler / mxCellMarker 431 已转换 / handler / mxCellTracker 146 / handler / mxConnectionHandler 2250 已转换 / handler / mxConstraintHandler 518
这篇文章写的非常好,深入...这不,前几天为了了解android的消息处理机 制,我看了Looper,Handler,Message这几个类的源码,结果又一次被googler的设计震撼了,特与大家分享。 android的消息处理有三个核心类:Looper
linux下netty包,用来作网络爬虫测试,通过netty来实现每秒1000+次请求,这个是netty包,为了方便把他传上来
概述该模块是调试Node.js C / C ++本机代码模块的... 使用该模块非常简单: var SegfaultHandler = require ( 'segfault-handler' ) ;SegfaultHandler . registerHandler ( "crash.log" ) ; // With no argument, Seg
其中的实现类似如下:// inboud事件默认处理过程// 事件传播到下一个Handler// outboud事件默认处理过程// 事件传播到下一个Handle
- Handler/Looper/Message:这是Android特有的异步处理机制,通过创建Handler,关联到特定线程的Looper,然后通过发送Message来执行异步任务。 3. 多线程核心机制——Handler/Looper/Message Handler、Looper和...
Introduction Declarative error handling.... @AutoHandler // let compiler know it should analyse your class public interface SimplerErrorListener { // your code has to implement this in
`Handler`是Android提供的一个关键工具,用于解决多线程环境下的消息传递和处理问题。本篇文章将深入探讨`Handler`实例及其在Android线程通信中的应用。 首先,线程间通信在Android中通常涉及到主线程(UI线程)与...
在Android开发中,`Handler`是一个至关重要的组件,主要用于解决线程间的通信问题,尤其是在UI线程和其他工作线程之间。本篇文章将深入探讨`Handler`的使用方法,包括其基本概念、工作原理以及如何避免内存泄露和...
"handler/{action}", // URL模板 "~/Handlers/MyHandler.ashx" // Handler的物理路径 ); ``` 在这个例子中,`MyHandler.ashx`是我们定义的Handler,`{action}`是动态参数,可以根据不同的URL段执行不同的处理逻辑...
在Android开发中,`Handler`是一个至关重要的组件,它用于在主线程中处理来自其他线程的消息,确保UI更新和事件处理的同步性。本文将详细介绍`Handler`的几种常见写法,以及如何使用`Handler.Callback`进行消息处理...
AsyncQueryHandler内部使用了Handler和Message对象,当调用startQuery()等方法时,实际上是向Handler发送了一个Message。这个Message包含查询的信息,然后在后台线程中执行操作。操作完成后,会将结果封装成另一个...
- **Handler/Looper**:如上所述,Handler结合Looper实现线程间通信,尤其适合需要更新UI的场景。 - **AsyncTask**:适合短时间、计算密集型任务,提供了简单的进度回调和结果返回机制。 - **IntentService**:...