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编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Java 中实现异步的多种方式

《Java中实现异步的多种方式》文章介绍了Java中实现异步处理的几种常见方式,每种方式都有其特点和适用场景,通过选择合适的异步处理方式,可以提高程序的性能和可维护性,感兴趣的朋友一起看看吧... 目录1. 线程池(ExecutorService)2. CompletableFuture3. ForkJoi

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图