Android 异步开发之 AsyncQueryHandler

2024-05-04 05:32

本文主要是介绍Android 异步开发之 AsyncQueryHandler,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AsyncQueryHandler

  官方解释是一个异步帮助类(A helper class to help make handling asynchronouContentResolver queries easier.) 。这个类的主要作用就是异步对DB数据库进行操作,加快其数据处理的速度(这个非常重要,特别是大容量的数据处理时,例如几千联系人的数据读取,按正常的处理速度会非常的慢,使用AsyncQueryHandler,这就会大大的加快速度,增加用户的良好体验)。


AsyncQueryHandler重要的方法:

final void startDelete(int token,  Object cookie,  Uri uri,  String selection,  String[] selectionArgs)
This method begins an asynchronous delete.
final void startInsert(int token,  Object cookie,  Uri uri,  ContentValues initialValues)
This method begins an asynchronous insert.
void startQuery(int token,  Object cookie,  Uri uri,  String[] projection,  String selection,  String[] selectionArgs,  String orderBy)
This method begins an asynchronous query.
final void startUpdate(int token,  Object cookie,  Uri uri,  ContentValues values,  String selection,  String[] selectionArgs)
This method begins an asynchronous update.
显然,从方法的名字,我们可以看出,这是使用异步方式对DB数据库进行基本的增,删,改,查。

void onDeleteComplete(int token,  Object cookie, int result)
Called when an asynchronous delete is completed.
void onInsertComplete(int token,  Object cookie,  Uri uri)
Called when an asynchronous insert is completed.
void onQueryComplete(int token,  Object cookie,  Cursor cursor)
Called when an asynchronous query is completed.
void onUpdateComplete(int token,  Object cookie, int result)
Called when an asynchronous update is completed.
这几个方法,分别对应于上面四个异步操作时的回调方法。


AsyncQueryHandler的一个应用:读取电话联系人的数据信息

[java]  view plain copy
  1. public class TestAsyncQueryHandler extends Activity {  
  2.       
  3.     private static final String NAME = "name", NUMBER = "number", SORT_KEY = "sort_key";  
  4.       
  5.     private List<ContentValues> listData;  
  6.     private AsyncQueryHandler asyncQuery;    
  7.       
  8.     private ListView personList;  
  9.     private BaseAdapter adapter;    
  10.     
  11.     @Override    
  12.     public void onCreate(Bundle savedInstanceState) {    
  13.         super.onCreate(savedInstanceState);    
  14.           
  15.         setContentView(R.layout.main);    
  16.           
  17.         personList = (ListView) findViewById(R.id.list_view);        
  18.         asyncQuery = new MyAsyncQueryHandler(getContentResolver());  
  19.         //异步读取联系人的信息  
  20.         asyncQueryContact();         
  21.     }    
  22.     
  23.   
  24.     private void asyncQueryContact() {  
  25.         // TODO Auto-generated method stub  
  26.         Uri uri = Uri.parse("content://com.android.contacts/data/phones");    
  27.         String[] projection = { "_id""display_name""data1""sort_key" };    
  28.         asyncQuery.startQuery(0null, uri, projection, nullnull,"sort_key COLLATE LOCALIZED asc");  
  29.     }  
  30.   
  31.   
  32.     private class MyAsyncQueryHandler extends AsyncQueryHandler {    
  33.     
  34.         public MyAsyncQueryHandler(ContentResolver cr) {    
  35.             super(cr);    
  36.     
  37.         }    
  38.     
  39.         @Override    
  40.         protected void onQueryComplete(int token, Object cookie, Cursor cursor) {    
  41.             if (cursor != null && cursor.getCount() > 0) {    
  42.                 listData = new ArrayList<ContentValues>();    
  43.                 //cursor.moveToFirst();    
  44.                 for (int i = 0; i < cursor.getCount(); i++) {  
  45.                     ContentValues cv = new ContentValues();    
  46.                     cursor.moveToPosition(i);    
  47.                     String name = cursor.getString(1);    
  48.                     String number = cursor.getString(2);    
  49.                     String sortKey = cursor.getString(3);  
  50.                     if (number.startsWith("+86")) {    
  51.                         cv.put(NAME, name);    
  52.                         //process (+86)  
  53.                         cv.put(NUMBER, number.substring(3));    
  54.                         cv.put(SORT_KEY, sortKey);    
  55.                     } else {    
  56.                         cv.put(NAME, name);    
  57.                         cv.put(NUMBER, number);    
  58.                         cv.put(SORT_KEY, sortKey);    
  59.                     }    
  60.                     listData.add(cv);    
  61.                 }    
  62.                 if (listData.size() > 0) {    
  63.                     setAdapter(listData);    
  64.                 }    
  65.                 cursor.close();  
  66.             }    
  67.         }    
  68.     
  69.     }    
  70.     
  71.     private void setAdapter(List<ContentValues> listData) {  
  72.         adapter = new ListAdapter(this, listData);  
  73.         personList.setAdapter(adapter);    
  74.     
  75.     }  
  76.       
  77.       
  78.     private class ListAdapter extends BaseAdapter {  
  79.           
  80.          private LayoutInflater inflater;    
  81.          private List<ContentValues> list;  
  82.           
  83.         public ListAdapter(Context context, List<ContentValues> list) {  
  84.             this.inflater = LayoutInflater.from(context);  
  85.             this.list = list;             
  86.         }  
  87.           
  88.         @Override  
  89.         public int getCount() {  
  90.             return list.size();  
  91.         }  
  92.   
  93.         @Override  
  94.         public Object getItem(int position) {  
  95.             return list.get(position);  
  96.         }  
  97.   
  98.         @Override  
  99.         public long getItemId(int position) {  
  100.             return position;  
  101.         }  
  102.           
  103.         @Override  
  104.         public View getView(int position, View convertView, ViewGroup parent) {  
  105.             ViewHolder holder;  
  106.             if (convertView == null) {    
  107.                 convertView = inflater.inflate(R.layout.list_item, null);  
  108.                 holder = new ViewHolder();    
  109.                 holder.name = (TextView) convertView.findViewById(R.id.name);    
  110.                 holder.number = (TextView) convertView.findViewById(R.id.number);    
  111.                 convertView.setTag(holder);    
  112.             } else {    
  113.                 holder = (ViewHolder) convertView.getTag();    
  114.             }    
  115.               
  116.             ContentValues cv = list.get(position);    
  117.             holder.name.setText(cv.getAsString(NAME));  
  118.             holder.number.setText(cv.getAsString(NUMBER));  
  119.   
  120.             return convertView;    
  121.         }  
  122.           
  123.         private class ViewHolder {   
  124.             TextView name;    
  125.             TextView number;  
  126.         }  
  127.           
  128.     }  
  129.        
  130. }    
  

  这个例子,只是使用了AsyncQueryHandler类中的异步查询方法,其它的方法,也是类似,大家可以自己尝试。


源代码下载地址:

           http://download.csdn.net/detail/hfreeman2011/5040647


参考资料:

1.android异步的几种方式

http://ericchan2012.iteye.com/blog/1673929

2.官方文档

http://developer.android.com/reference/android/content/AsyncQueryHandler.html

3.android快速滑动列表 首字母提示

http://download.csdn.net/detail/j1582830/4010012

这篇关于Android 异步开发之 AsyncQueryHandler的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958417

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程