`
zhenzxie
  • 浏览: 68196 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Android学习之路——3.Handler的子类

阅读更多
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源码——HandlerMessage2.rar

    在"安卓Android源码——HandlerMessage2.rar"中,你可能会找到关于这些概念的实际代码示例,这将有助于你从实践中学习和掌握`Handler`、`Message`的使用方法。通过分析和调试这些代码,你将能够更好地理解Android...

    安卓Android源码——ListViewSample.rar

    在安卓开发中,ListView是一个非常...通过深入研究`ListViewSample`的源码,开发者能够理解ListView的工作流程,学习如何高效地使用Adapter,以及如何优化ListView的性能,为自己的Android应用开发带来宝贵的实践经验。

    安卓Android源码——SQLiteOpenHelperSample.rar

    学习这个示例项目,开发者可以更好地理解如何在Android应用中管理SQLite数据库,包括版本控制和生命周期管理。同时,这也能帮助开发者了解如何在实际项目中安全地进行数据操作。在实际开发中,通常会结合...

    安卓Android源码——动态壁纸源码.zip

    学习这个源码,开发者可以了解到如何利用Android的Surface和Canvas进行图形绘制,如何使用Handler和Runnable来实现定时更新,以及如何处理触摸事件。此外,还能掌握如何将动态壁纸集成到系统设置中,让用户可以方便...

    Android源码——UI界面源码.zip

    本资源“Android源码——UI界面源码.zip”包含了一些关于Android UI界面的源代码,帮助开发者深入理解Android UI的设计原理和实现机制。下面我们将详细探讨Android UI界面的相关知识点。 首先,Android UI主要基于...

    安卓Android源码——实现抖动窗口.zip

    在安卓开发中,实现抖动窗口是一项常见的交互设计,它能为用户带来生动有趣的体验,尤其是在需要引起用户注意或者确认...通过学习和理解这些代码,开发者可以更好地掌握 Android 动画系统的运用,提升应用的用户体验。

    安卓Android源码——MIUI便签.zip

    本压缩包文件“安卓Android源码——MIUI便签.zip”包含了MIUI便签应用的源代码,对于想要深入理解Android应用开发、特别是MIUI系统的开发者来说,这是一个非常有价值的资源。 1. **Android 应用架构** MIUI 便签...

    安卓Android源码——TronWallpaper-master.zip

    【Android源码分析——TronWallpaper项目详解】 在安卓开发领域,理解源码是提升技术深度的关键步骤。本文将深入解析"TronWallpaper-master.zip"中的Android源码,帮助开发者了解如何创建一个自定义壁纸应用。...

    安卓Android源码——股民邦.zip

    在Android开发中,源码是学习和优化应用的关键,它揭示了应用内部的工作机制,让我们能够探究如何实现特定功能,以及如何优化性能。 一、Android应用基础结构 Android应用的基本构建块包括Activity、Service、...

    Android源码——滴答词典源码.zip

    考虑到Android应用的主线程不能进行耗时操作,滴答词典的源码中可能使用AsyncTask、Handler或Retrofit结合RxJava进行异步处理,以避免UI卡顿。 9. **自定义View与动画效果** 提高用户体验的一个重要方面是定制化...

    安卓Android源码——SipDroid客户端源码.zip

    总结,通过分析SipDroid的源码,我们可以学习到如何在Android上实现一个完整的SIP客户端,包括SIP协议的实现、网络连接的建立、音频流的处理以及用户界面的设计。这对于想要开发类似应用或深入理解Android通信机制的...

    安卓Android源码——用ViewPager实现手动切换,用Timer + Handler实现自动切换.zip

    自动切换——Timer + Handler** 为了实现自动切换,我们可以使用`Timer`和`Handler`。首先创建一个Handler实例,然后定义一个Runnable对象,在run方法中更新ViewPager的当前页,并将Runnable对象postDelay到...

    Android源码——豆瓣手机客户端源码.zip

    【Android源码——豆瓣手机客户端源码.zip】这个压缩包主要包含了豆瓣手机客户端的源代码,这为我们提供了深入了解Android应用开发的机会,特别是针对豆瓣这款知名应用的实现细节。以下是一些核心知识点: 1. **...

    安卓Android源码——查询工具源代码.zip

    这个压缩包"安卓Android源码——查询工具源代码.zip"显然包含了用于查询操作的工具的源代码,这对于理解和学习Android系统的内部工作原理,以及如何构建自己的应用程序具有重要价值。下面我们将详细探讨相关的知识点...

    Android应用源码之游戏源码——忍者快跑.zip

    总的来说,"Android应用源码之游戏源码——忍者快跑"是一个丰富的学习资源,涵盖了Android游戏开发的多个方面,包括但不限于Activity管理、图形渲染、触摸事件处理、音频管理、多线程编程、数据持久化和网络通信。...

    安卓Android源码——多点触控实例源码.zip

    这个“安卓Android源码——多点触控实例源码.zip”压缩包包含了一个具体的多点触控应用的源代码,可以帮助开发者深入理解如何在Android应用中实现这一特性。 首先,我们需要了解多点触控的基本概念。多点触控...

    安卓Android源码——平台水波效果源码.zip

    "安卓Android源码——平台水波效果源码.zip" 提供的是一份实现水波动态效果的源代码,适用于增强应用程序的交互性和视觉吸引力。这个源码可以帮助开发者理解和学习如何在Android应用中创建类似水面波动的动画效果。 ...

    安卓Android源码——广告轮播效果源码.zip

    这个压缩包文件“安卓Android源码——广告轮播效果源码.zip”主要包含了一个实现广告轮播效果的Android应用源代码。广告轮播通常在移动应用中被广泛使用,用于展示多个广告图片或内容,用户可以左右滑动查看。下面...

    android 博客源码(blog) .zip

    在移动开发领域,Android作为全球最流行的智能手机操作系统之一,其应用开发需求日益增长。为了提高开发者的学习效率和实践能力,许多开发者会分享他们的源码,供他人学习和借鉴。今天我们将深度剖析一个名为...

    Android源码——酒店预订系统源码.7z

    通过学习这个酒店预订系统的源码,开发者可以深入理解Android应用开发的全貌,提高自己在实际项目中的技能。同时,源码中的设计模式和最佳实践也值得借鉴,对于提升代码质量和可维护性大有裨益。

Global site tag (gtag.js) - Google Analytics