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

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按