- 浏览: 212295 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 2424public class AndroidTest extend ... -
Android下PopupWindow隐藏及显示(showAtLocation/showAsDropDown)
2012-08-26 00:56 13001上一篇对PopupWindow的用法(位置、动画、焦点)做了详 ... -
Android中PopupWindow的用法(位置、动画、焦点)
2012-08-26 00:54 1984在Android中有很多级别的Window,不同级别的Wind ... -
Color android
2012-08-24 15:07 1131有以下12种常见的颜色: Color.BLACK ... -
【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性
2012-08-16 15:03 936在进行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 1972转自:http://www.open-ope ... -
Android 实现省份城市的选择,并获取城市编号
2012-08-14 00:47 18619该程序主要使用 中央气象局 省份 城市数据库为基础 进行 ... -
让你全面了解SQLite
2012-08-14 00:45 1309一.SQLite的介绍1.SQLite简介SQLite是 ... -
android 模拟器手机如何添加文件到sd卡
2012-08-14 00:05 1318使用android手机模拟器 ... -
Eclipse用svn管理Android项目问题
2012-08-11 15:10 906用svn控制版本,svn本身是不会识别哪些该传,哪些不该 ... -
ListView动态加载数据分页(使用Handler+线程和AsyncTask两种方法)
2012-08-11 14:58 1037在android开发中,经 ... -
关于eclipse中关联各版本Android.jar对应的源代码方法
2012-08-11 13:59 946网上看了很多关于在Android APP开发时,将And ... -
android在处理一写图片资源
2012-08-09 23:01 7811、Drawable → Bitmap publ ... -
Android用ImageView显示本地和网上的图片
2012-08-09 22:48 5370ImageView是Android程序中经常用到的组件, ... -
Android中LayoutInflater的使用
2012-08-09 18:42 931Inflater英文意思是膨胀,在Android中应该是 ... -
Android模拟器代理设置
2012-08-09 16:03 18029方法一 首先,Windows下,配置Adro ... -
android中ListView控件&&onItemClick点击事件
2012-08-09 15:46 1032转自:http://hi.baidu.com/ilybeen/ ... -
Android 获取设备各种信息以及其它
2012-08-06 14:27 1365做手机开发,想必都希望获取手机号码吧,android中有 ... -
android 安卓APP获取手机设备信息和手机号码的代码示例
2012-08-06 14:26 1742下面我从安卓开发的角度,简单写一下如何获取手机设备信息和 ...
相关推荐
Looper、Handler与HandlerThread相关概念与简介
HandlerThread handlerThread = new HandlerThread("handler_thread"); //在使用HandlerThread的getLooper()方法之前,必须先调用该类的start()方法,否则获得的值为空值; handlerThread.start(); //创建...
对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),详见《 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)...
Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解
自己使用资源; 自己理解:1、给线程传参数;2、可处理多线程
Handler 在 MessageQueue 中以任务形式排队,Looper 在任务出现时执行它们 MessageQueue. Looper 使线程保持活动状态,循环 MessageQueue 并向相应 Handler 的进程发送消息。 Thread 通过调用 Looper 的 quit() ...
HandlerThread的使用以及注意事项
三种不同的方式讲述了如何开辟新线程处理进度条的更新。运行时需修改Mainfest,来用不同的方式运行。默认是使用AsyncTask运行
详见http://blog.csdn.net/huaxun66/article/details/52842118
HandlerThread的使用与自定义HandlerThread 使用过程中常见的问题,以及为什么要使用
Android Handler类 Android Handler类 Android Handler类 Android Handler类
有关于Handler、HandlerThread、AsyncTask消息处理机制的相关Demo代码
Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存,在Android中,Handler对象通常会被用来在主线程(UI线程)中处理消息,以更新UI界面。当我们在Handler对象中使用匿名内部类...
android中Handler类的使用,代码说明请参见以下链接: http://blog.csdn.net/ymlxku/article/details/8489572
Android Handler详细解析,讲解Handler之间的通讯,叫你如果用Handler完成异步线程对 UI的更新
Looper MessageQueue 源码解析,通过源码 手写一套自己的Handler。
这个demo演示了在handler之间传递代码
本篇我们将来给大家介绍HandlerThread这个类,以前我们在使用线程执行一个耗时任务时总会new一个Thread的线程去跑,当任务执行完后,线程就会自动被销毁掉,如果又由新的任务,我们又得新建线程…..我们假设这样的一...