- 浏览: 215205 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
gotosuzhou:
我想问下, 怎么设置汉字 我这个验证码想要有汉字
kaptcha 验证码组件使用简介 -
摸爬滚打NO1:
很好,详细
kaptcha 验证码组件使用简介 -
guodage003:
这是怎么回事?
eclipse提示failed to create JVM -
joefei:
我修改第二个没用,修改了第一个,size为128才可以
eclipse提示failed to create JVM -
tingle:
签名后的,可以吗?
Android APK反编译
Handler,HandlerThread下次再写;
1)核心成员变量:
final MessageQueue mQueue;//消息队列,通过Loooper拿到的;
final Looper mLooper;//消息泵,管理消息队列,通过形参传入,我是主线程的Looper;
inal Callback mCallback;//handle的定义的一个内部接口,也是用来接收消息的;
2)核心成员函数;
public interface Callback {//一个回调接口,Handler带一个成员变量,可以通过构造函数的形参传入;
public boolean handleMessage(Message msg);
}
**
* 子类可以继承此方法,用来处理消息;
*/
public void handleMessage(Message msg) {
}
/**
* 内部派发消息,
* 就是looper这个消息泵的loop()循环方法中通过封装在meesge的handler调用的;
*/
public void dispatchMessage(Message msg) {
if (msg.callback != null) //如果消息包含动作,直接指向runnable的方法;
{
//运行msg里面的Runnable;
handleCallback(msg);
}
else
{
//判断自身的mCallback,也就是是否有回调监听;
if (mCallback != null)
{
//注意这里的表示,如果不是返回ture的话,还是会调用子类重载的方法;
if (mCallback.handleMessage(msg)) //回调;
{
return;//注意这里的返回;
}
}
handleMessage(msg);//调用子类的方法,也就是我们常用的,通过extends handler继承的得到的处理消息的方法;
}
}
构造函数1)无参:
public Handler() {
//获取当前线程的messageQuenue管理者looper;
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
//handler对象须有一个对应的Looper;
"Can't create handler inside thread that has not called Looper.prepare()");
}
//获取消息队列;
mQueue = mLooper.mQueue;//获取消息队列;
//置null回调;
mCallback = null;
}
/**
* 构造函数2)带回调监听;
*/
public Handler(Callback callback) {
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
}
/**
* 构造函数3)用提供的looper管理者替换默认的;
*/
public Handler(Looper looper) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = null;
}
/**
* 构造函数4)替代looper和接口监听;
*/
public Handler(Looper looper, Callback callback) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = callback;
}
/**
* 获取消息成员方法,还有很多,实际都是通过Message类获取的;
*/
public final Message obtainMessage(int what)
{
return Message.obtain(this, what);
}
非常重要的一个方法:
/**
*通过Handler post一个任务runnable到消息队列;
*/
public final boolean post(Runnable r)
{
return sendMessageDelayed(getPostMessage(r), 0);
}
我们分析一下怎么实现的:
1.通过:sendMessageDelayed(getPostMessage(r), delayMillis);
2.getPostMessage(r)的作用就是发挥一个带runnable的Meesage;
/**
* 建造带runnable的Msg;
*/
private final Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;//看到没有,Message的一个成员方法,后续我们会分析Message的;
return m;
}
这里Message携带了一个runnable,有什么用了?回到dispatchMessage方法,处理消息的第一步就是处理的msg的run方法;
这样就到达了post一个任务进去的目的;
/**
* 运行message.callbakc也就是Runnable的run()方法;
*/
private final void handleCallback(Message message) {
message.callback.run();
}
Handler的消息发送,非常核心的方法,就是通过 MessageQueue 的成员方法把msg插入队列;
/**
* 核心方法,基本所有的消息发送都是通过这个方法;
* 发送一个指定时间的消息;
*/
public boolean sendMessageAtTime(Message msg, long uptimeMillis)
{
boolean sent = false;
MessageQueue queue = mQueue;
if (queue != null) {
msg.target = this;
sent = queue.enqueueMessage(msg, uptimeMillis);
}
else {
//抛出运行时异常;
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
}
return sent;
}
辅助方法,主要是清除掉msg消息和callback.因为有个时候退出的时候,或是取消的时候,需要清除前面的方法;
/**
* 清楚消息队列中所有what标识的消息;
*/
public final void removeMessages(int what) {
mQueue.removeMessages(this, what, null, true);
}
发表评论
-
android2.2根据电话号码查询联系人姓名的方法
2012-09-16 23:28 2474public class AndroidTest extend ... -
Android下PopupWindow隐藏及显示(showAtLocation/showAsDropDown)
2012-08-26 00:56 13069上一篇对PopupWindow的用法(位置、动画、焦点)做了详 ... -
Android中PopupWindow的用法(位置、动画、焦点)
2012-08-26 00:54 2023在Android中有很多级别的Window,不同级别的Wind ... -
Color android
2012-08-24 15:07 1176有以下12种常见的颜色: Color.BLACK ... -
【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性
2012-08-16 15:03 983在进行UI布局的时候,可能经常会用到 android:g ... -
android ksoap 报错 org.xmlpull.v1.XmlPullParserException: expected: START_TAG 的解决经
2012-08-14 19:47 0在android上 调用webservice出现这个错误 ... -
Android与服务器端数据交互(基于SOAP协议整合android+webservice)
2012-08-14 12:31 2011转自:http://www.open-ope ... -
Android 实现省份城市的选择,并获取城市编号
2012-08-14 00:47 18751该程序主要使用 中央气象局 省份 城市数据库为基础 进行 ... -
让你全面了解SQLite
2012-08-14 00:45 1364一.SQLite的介绍1.SQLite简介SQLite是 ... -
android 模拟器手机如何添加文件到sd卡
2012-08-14 00:05 1357使用android手机模拟器 ... -
Eclipse用svn管理Android项目问题
2012-08-11 15:10 946用svn控制版本,svn本身是不会识别哪些该传,哪些不该 ... -
ListView动态加载数据分页(使用Handler+线程和AsyncTask两种方法)
2012-08-11 14:58 1070在android开发中,经 ... -
关于eclipse中关联各版本Android.jar对应的源代码方法
2012-08-11 13:59 999网上看了很多关于在Android APP开发时,将And ... -
android在处理一写图片资源
2012-08-09 23:01 8231、Drawable → Bitmap publ ... -
Android用ImageView显示本地和网上的图片
2012-08-09 22:48 5428ImageView是Android程序中经常用到的组件, ... -
Android中LayoutInflater的使用
2012-08-09 18:42 969Inflater英文意思是膨胀,在Android中应该是 ... -
Android模拟器代理设置
2012-08-09 16:03 18104方法一 首先,Windows下,配置Adro ... -
android中ListView控件&&onItemClick点击事件
2012-08-09 15:46 1077转自:http://hi.baidu.com/ilybeen/ ... -
Android 获取设备各种信息以及其它
2012-08-06 14:27 1431做手机开发,想必都希望获取手机号码吧,android中有 ... -
android 安卓APP获取手机设备信息和手机号码的代码示例
2012-08-06 14:26 1868下面我从安卓开发的角度,简单写一下如何获取手机设备信息和 ...
相关推荐
在Android开发中,Looper、Handler和HandlerThread是三个非常重要的组件,它们构成了Android消息处理机制的基础,用于在主线程中处理来自其他线程的消息。理解并熟练运用这三个组件,对于编写高效、响应迅速的...
【HandlerThread】是一种在Android系统中专为处理后台任务而设计的线程类。它继承自`Thread`,并结合了`Looper`和`Handler`的概念,使得开发者可以在子线程中创建一个消息循环,方便地处理来自主线程或其他线程的...
本文将全面解析`HandlerThread`的工作原理、使用方法以及它在实际开发中的应用。 1. **`HandlerThread`简介** `HandlerThread`是Android中的一个内置类,它继承自`Thread`,并添加了`Looper`和`Handler`的支持。...
HandlerThread handlerThread = new HandlerThread("handler_thread"); //在使用HandlerThread的getLooper()方法之前,必须先调用该类的start()方法,否则获得的值为空值; handlerThread.start(); //创建...
本示例探讨了三种不同的方法——HandlerThread、AsyncTask以及Handler,它们都是用来在后台线程处理耗时操作并更新UI(主线程)的有效手段。下面我们将深入理解这三个概念及其在进度条更新中的应用。 首先,...
对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),详见《 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)...
Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解
本文将深入探讨 `HandlerThread` 的使用、工作原理,并讲解如何自定义 `HandlerThread`,以及为什么在某些场景下我们需要使用它。 `HandlerThread` 是 Android SDK 提供的一个特殊线程类,它的核心功能是结合了线程...
在Android开发中,理解核心组件如Looper、Handler和HandlerThread对于构建高效且响应式的用户界面至关重要。这些组件共同协作,确保UI线程不被阻塞,从而提供流畅的用户体验。 首先,主线程(也称为UI线程)是...
MyBatis 3.x 源码深度解析与最佳实践 MyBatis 是当前最流行的 Java 持久层框架之一,其通过 XML 配置的方式消除了绝大部分 JDBC 重复代码以及参数的设置,结果集的映射。为了更好地学习和理解 MyBatis 背后的设计...
2. **创建Handler**:创建一个与`HandlerThread`的`Looper`关联的`Handler`,用于接收和处理消息。 3. **发送消息**:在需要执行后台任务的地方,使用`Handler`的`sendMessage()`或`post()`方法发送消息。 4. **处理...
这个项目可能包括创建HandlerThread,创建Handler,以及在主线程和其他线程之间发送消息的代码。通过研究这个示例,开发者可以更深入地理解HandlerThread的工作原理和应用场景。 总之,HandlerThread是Android多...
这通常包括创建 `HandlerThread` 对象、启动线程、创建与线程关联的 `Handler`,以及在其他线程中发送消息到 `Handler` 进行处理的过程。 总的来说,`HandlerThread` 是 Android 平台中处理后台任务的一种高效手段...
HandlerThread是Android提供的一个用于在后台线程执行任务的类,它是基于Thread和Looper的。在Android中,主线程负责处理UI更新和用户交互,因此不应在主线程中执行耗时操作,否则可能导致ANR。使用HandlerThread...
`HandlerThread` 的工作原理与普通的线程有所不同,它结合了`Handler`、`Looper` 和 `MessageQueue`,使得开发者可以在单独的线程中处理消息,避免阻塞主线程,提高应用程序的响应速度。 描述中的"handlerthread做...
`Handler`、`HandlerThread`和`AsyncTask`都是Android系统提供的处理异步任务的机制,它们各自有其特点和适用场景。下面我们将分别详细介绍这三个组件,并通过相关Demo代码来理解它们的工作原理。 ### 1. Handler...
HandlerThread的使用以及注意事项