Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android AsyncQueryHandler

Android AsyncQueryHandler

編輯:Android開發實例

Class Overview

A helper class to help make handling asynchronous ContentResolver queries easier.

AsyncQueryHandler的目的就是為了將查詢數據庫的操作放到後台執行,當後台數據查詢完了以後,再通知界面的更新,以此來提高前台頁面的顯示速度!

內部的實現機制其實就是Handler,我們自己平時做大數據量顯示的時候也用到過,另起一個線程去執行任務,當後台計算完成的時候通過Handler發送Message來重繪界面,這個的實現原理類似,做了一層封裝而已,方便開發人員的調用。

Public Methods final        void cancelOperation(int token)

 

Attempts to cancel operation that has not already started. void handleMessage(Message msg)

 

Subclasses must implement this to receive messages. 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. Protected Methods Handler createHandler(Looper looper) 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.

 

其實這些方法都是成對來使用的,比如查詢操作,我們通過調用 startDelete(int token, Object cookie, Uri uri, String selection, String[] selectionArgs)來執行,AsyncQueryHandler就會異步啟動一個線程去做數據查詢操作,當操作完成的時候就會回調onQueryComplete(int token, Object cookie, Cursor cursor)函數,我們在這個函數裡面執行界面的刷新操作。

注:

1.  token參數是為了區分多次調用查詢操作的每一次操作,在回調函數中來識別這是哪一個查詢

2. cookie參數就是為了傳遞一個附加變量,在回調函數中可以使用

這兩個參數在對應的查詢函數和查詢完成的回調函數中是一致的

代碼示例:

我實現了一個小程序,用來顯示手機上面的聯系人信息,一開始列表顯示假的數據,當後台聯系人查詢完成的時候通知界面刷新,顯示真實的聯系人數據,為了達到演示的效果,特別加入了一個延時語句,實際開發中沒有必要!

   
  1. package com.carey.com;  
  2.  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.  
  6. import android.app.ListActivity;  
  7. import android.content.AsyncQueryHandler;  
  8. import android.content.ContentResolver;  
  9. import android.database.Cursor;  
  10. import android.net.Uri;  
  11. import android.os.Bundle;  
  12. import android.os.Handler;  
  13. import android.provider.ContactsContract.Contacts;  
  14. import android.util.Log;  
  15. import android.widget.ArrayAdapter;  
  16. import android.widget.ListAdapter;  
  17. import android.widget.SimpleCursorAdapter;  
  18.  
  19. public class TestAsyncQueryHandlerActivity extends ListActivity {  
  20. private static final String TAG = "TestAsyncQueryHandlerActivity";  
  21.  
  22. private Handler mHandler = new Handler();  
  23.  
  24. /** Called when the activity is first created. */ 
  25. @Override 
  26. public void onCreate(Bundle savedInstanceState) {  
  27. super.onCreate(savedInstanceState);  
  28. setContentView(R.layout.main);  
  29.  
  30. Log.d(TAG, "before query:" + System.currentTimeMillis());  
  31. mHandler.postDelayed(new Runnable() {  
  32. public void run() {  
  33. QueryHandler qh = new QueryHandler(  
  34. TestAsyncQueryHandlerActivity.this.getContentResolver());  
  35. qh.startQuery(1, "111", Contacts.CONTENT_URI, null, null, null,  
  36. null);  
  37. }  
  38. }, 10000);  
  39. Log.d(TAG, "after query:" + System.currentTimeMillis());  
  40.  
  41. // Cursor mCursor =  
  42. // this.getContentResolver().query(Contacts.CONTENT_URI,  
  43. // null, null, null, null);  
  44. // startManagingCursor(mCursor);  
  45. setListAdapter(new ArrayAdapter<String>(this,  
  46. android.R.layout.simple_expandable_list_item_1, getData()));  
  47.  
  48. }  
  49.  
  50. private List<String> getData() {  
  51.  
  52. List<String> data = new ArrayList<String>();  
  53. data.add("測試數據1");  
  54. data.add("測試數據2");  
  55. data.add("測試數據3");  
  56. data.add("測試數據4");  
  57.  
  58. return data;  
  59. }  
  60.  
  61. /**  
  62. * Class used to run asynchronous queries to re-populate the notifications  
  63. * we care about.  
  64. */ 
  65. private class QueryHandler extends AsyncQueryHandler {  
  66.  
  67. public QueryHandler(ContentResolver cr) {  
  68. super(cr);  
  69. }  
  70.  
  71. @Override 
  72. public void startQuery(int token, Object cookie, Uri uri,  
  73. String[] projection, String selection, String[] selectionArgs,  
  74. String orderBy) {  
  75. Log.d(TAG, "<startQuery> token: " + token + ", cookie: " + cookie);  
  76.  
  77. super.startQuery(token, cookie, uri, projection, selection,  
  78. selectionArgs, orderBy);  
  79. }  
  80.  
  81. @Override 
  82. protected void onQueryComplete(int token, Object cookie, Cursor cursor) {  
  83. Log.d(TAG, "<onQueryComplete> token: " + token + ", cookie: " 
  84. + cookie);  
  85.  
  86. ListAdapter adapter = new SimpleCursorAdapter(  
  87. TestAsyncQueryHandlerActivity.this,  
  88. android.R.layout.two_line_list_item, cursor, new String[] {  
  89. Contacts.DISPLAY_NAME, Contacts.TIMES_CONTACTED },  
  90. new int[] { android.R.id.text1, android.R.id.text2 });  
  91.  
  92. setListAdapter(adapter);  
  93. // TODO Auto-generated method stub  
  94. super.onQueryComplete(token, cookie, cursor);  
  95. }  
  96.  
  97. }  
  98. }  

官方鏈接: http://developer.android.com/reference/android/content/AsyncQueryHandler.html

 

轉自:http://blog.zhourunsheng.com/2011/06/asyncqueryhandler/

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved