API中介绍Handler的子类有四个,分别是:
AsyncQueryHandler, WorkerHandler, HttpAuthHandler, SslErrorHandler。
其中WorkerHandler是AsyncQueryHandler的内部类,另一个内部类是WorkerArgs,它们俩是帮助AsyncQueryHandler来实现异步处理ContentResolver事务的。
(一)AsynQueryHandler和WorkerHandler
1.AsyncQueryHandler和AsyncQueryHandler.WorkerHandler在android.content包下,作用是帮助更轻松的处理需要异步的ContentResolver查询等事务。(API中原文是:A helper class to help make handling asynchronous ContentResolver queries easier.)
2.AsyncQueryHandler是抽象类,所以要使用它就必须继承它,并实现onXXXXComplete()方法,处理当查询等事务完成时应该做的操作。
3.AsycQueryHandler中有一个WorkerArgs内部类,保存着一些数据。
请看贴图:
子类在实现自己的handlerMessage()方法时,调用super.handleMessage(Message)时,应注意Message中的obj参数可以向下转化为WorkerArgs对象。AsycQueryHandler的startXXXX()方法使用WorkArgs对象来传递执行所需要的参数,并把WorkArgs对象赋给Message.obj。Message中的arg1中保存着要进行的操作,AsycQueryHandler中有四个静态的实例域代表四种操作。
请看startUpdate()的实现:
4.当一个子类继承AsycQueryHandler,并实现自己的OnXXXXComplete()方法时,如果子类对象调用startXXXX()方法,那么事务处理的顺序可以清楚的知道。首先需要明确这些事务的处理是在主线程之外的线程(通过HandlerThread实现,应该也可以把主线程的Looper传递给它吧。)进行的。但是多个子类实例也只会开启一个线程,使用同一个Looper对象。当创建对象的时候,会创建另一个Handler对象那就是WorkerHandler对象。
请看AsyncQueryHandler的构造方法:
然后当调用startXXXX方法时,依据参数创建一个WorkArgs对象赋给新获得的Message对象的obj,Message对象会传递给上面的WorkHandler对象的消息队列,然后处理(参看上第二图)。处理完后WorkHandler对象会将消息传递给AsycQueryHandler对象的消息队列,然后处理,这时候的处理是调用onXXXXComplete方法,来实现回调的。
请看图:
看了这个过程可以知道子类没有必要自己实现handleMessage()方法。只需要创建AsycQueryHandler子类对象,并实现自己的OnXXXXComplete()方法,然后调用startXXXX()方法。
5.使用方法示例:(示例来自网络)
// 定义一个handler,采用的是匿名类的方式,只处理query,因此只重写了onQueryComplete函数:
queryHandler = new AsyncQueryHandler(this.getContentResolver()){ // 传入的是一个ContentResolver实例,所以必须在OnCreate后实例化该Handler类
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
// 在这里你可以获得一个cursor和你传入的附加的token和cookie。
// 该方法在当前线程下(如果传入的是默认的Looper话),可以自由设定UI信息
}
};
//调用时只需要调用startQuery(int token, Object cookie, ContentURI uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)函数即可:
queryHandler.startQuery(token,cookie,uri, projection, selection, selectionArgs, sortBy);
补充:
在看AsyncQueryHandler的回调时,它比不是通过接口来实现的,而是通过继承来实现的。
先看下面一段代码。
public class C {
public static void main(String[] args) {
A a = new B();
a.deal("Learn Android Everyday");//一
new B().handler("Learn Android Everyday");//二
}
}
class A {
public void handler(String arg) {
System.out.println("In the class A handler :" + arg);
onHandler(arg);
}
public void onHandler(String arg) {
System.out.println("In the class A onHandler :" + arg);
}
public void deal(String arg){
System.out.println("In the class A deal :" + arg);
}
}
class B extends A {
@Override
public void handler(String arg) {
super.handler(arg);
}
@Override
public void onHandler(String arg) {
System.out.println("In the class B onHandler :" + arg);
}
@Override
public void deal(String arg){
System.out.println("In the class B deal:" + arg);
}
}
运行的结果是:
In the class B deal:Learn Android Everyday
In the class A handler :Learn Android Everyday
In the class B onHandler :Learn Android Everyday
在“一”处:体现了Java的继承实现的动态绑定,调用的是子类的deal()方法。
而“二”处:调用的是子类的handler()方法,但是子类的方法调用了父类的方法。在父类的handler()方法里在调用onHandler()方法,这时候它回调了子类的onHandler()方法。这也是AsyncQueryHandler回调的实现方法。
(二)HttpAuthHandler和SslErrorHandler
1.类的定义里除了两个return false之外没有任何实现,自己继承吧。API原文里讲:HTTP authentication request that must be handled by the user interface. WebView creates the object and hands it to the current WebViewClient, which must call either proceed(String, String) or cancel(). 估计大概是和WebViewClient配合使用吧。
2.类的定义里没有任何实现。用于处理Ssl错误的,当作参数传递给BrowserCallback.displaySslErrorDialog,接受用户的回应。(API中原文:class responsible for handling SSL errors. This class is passed as a parameter to BrowserCallback.displaySslErrorDialog and is meant to receive the user's response。不知道翻译的对不对)
3.这两个类来自android.webkit包,类里的方法都是没有实现的,但又不是写成abstract。大概是想让子类更好继承吧。
- 大小: 18.3 KB
- 大小: 9.9 KB
- 大小: 16.8 KB
- 大小: 17.7 KB
分享到:
相关推荐
安卓Android源码——HandlerMessage3.rar
安卓Android源码——HandlerLooper2.rar
安卓Android源码——HandlerLooper1.rar
安卓Android源码——HandlerMessage1.rar
安卓Android源码——HandlerMessage2.rar
所以我们要修改一下源文件jquery.easydrag.handler.beta2.js:找到 function(handlerId) 这个函数, 将里面的$(“#”+handlerId)都改成$(“.”+handlerId)就可以了。好吧,这样就可以了,下面是实例,高手们请 ...
或许困扰很多Android开发者最大的问题莫过于Bug的修改了,调Bug 改Bug,想想都头疼,以下就是一位对Bug很有经验的开发者总结出来的有关Android错误的解决方法。
熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制。实际上谷歌参考了Windows的...Android通过Looper、Handler来
python使用serial模块,通过串口控制云台(基于PELCO-D协议)(csdn)————程序
安卓学习教材经验Android进阶学习资料安卓面试资料等文档资料合集(22个): ...初中级Android开发社招面试之Handler.pdf 初中级Android开发社招面试之JNI.pdf 初中级Android开发社招面试之Service及BroadcastReceiver.p
android.os.Handler的内存安全实现 问题 Handler的原始实现始终在执行队列中始终保持对处理程序的硬引用。 张贴到android.os.Handler Message或Runnable中的任何对象将在一段时间内被硬引用。 如果创建匿名Runnable...
Android高手进阶教程之----Android Handler的使用!!! .doc Android高手进阶教程之----Android Launcher抽屉类SlidingDrawer的使用.doc Android高手进阶教程之----Android Location的使用!! .doc Android高手进阶...
Android应用源码之HandlerMessage3.zip项目安卓应用源码下载Android应用源码之HandlerMessage3.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
4.17 后台程序运行进度提示——ProgressBar与Handler的整合应用 4.18 动态文字排版——GridView与ArrayAdapter设计 4.19 在Activity里显示列表列表——ListView的布局 4.20 以动态列表配置选项——ListActivity与...
Android Weak Handler Memory safer implementation of android.os.Handler Problem Original implementation of Handler always keeps hard reference to handler in queue of execution. Any object in Message or...
赠送jar包:netty-handler-4.1.73.Final.jar; 赠送原API文档:netty-handler-4.1.73.Final-javadoc.jar; 赠送源代码:netty-handler-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:netty-handler-4.1.73....
1.handler是什么? 2.handler怎么用? 3.为什么要用handler?
android源码中包含了大量的设计模式, 除此以外, android sdk还精心为我们设计了各种helper类, 对于和我一样渴望水平得到进阶的人来说, 都太值得一读了。 这不, 前几天为了了解android的消息处理机制, 我看 了...
【Android开发入门】Android线程之Handler