您的位置:首页 > 产品设计 > UI/UE

AsyncQueryHandler

2013-12-13 11:24 239 查看
AsyncQueryHandler:异步的查询操作帮助类,其实它同样可以处理增删改

1。AsyncQueryHandler的作用

查询其API便可知,它担供:

startInsert

startDelete

startUpdate

startQuery

这四个操作,并提供相对应的onXXXComplete方法,以供操作完数据库后进行其它的操作,这四个onXXXComplete方法都是空实现,以便我们只需要去实现我们关注的操作。

2。为什么要使用AsyncQueryHandler

当然你也可以使用ContentProvider去操作数据库。

这在数据量很小的时候是没有问题的,但是如果数据量大了,可能导致UI线程发生ANR事件。

当然你也可以写个Handler去做这些操作,只是你每次使用ContentProvider时都要再写个Handler,必然降低了效率。

因此API提供了一个操作数据库的通用方法。

3。如何使用AsyncQueryHandler

你只需要继承AsyncQueryHandler类,并提供onXXXComplete方法的实现(可以实现任何一个或多个,当然你也可以一个也不实现,如果你不关注操作数据库的結果),在你的实现中做一些对数据库操作完成的处理。

使用时直接调用startXXX方法即可。传入的通用参数如下:

int token,一个令牌,需要跟onXXXComplete方法传入的一致。(当然你也可以不一致,同样在数据库的操作结束后会调用对应的onXXXComplete方法 )

Object cookie,你想传给onXXXComplete方法使用的一个对象。(没有的话传递null即可。基本发现这个变量没太大作用)

Uri uri,(不解释)

4。AsyncQueryHandler还为我们做了什么

AsyncQueryHandler中使用了一个WeakReference<ContentResolver>对象,即ContentResolver的弱引用  作用:当contentProvied发生变化时候同步更新仍可以通过使用AsyncQueryHandler类来达到这一要求(暂时还没理解这个作用)

同时,在它执行操作数据库时,吃掉了所有的异常。见如下代码。

catch (Exception e) {

Log.w(TAG, e.toString());

cursor = null;

}

android.content.AsyncQueryHandler继续于android.os.Handler

虽然Handler自己是没另开新线程,但是AsyncQueryHandler自己却是另开了一个线程来进行数据的查询

实例1

AsyncQueryHandler -->同步更新

class QueryHandler extends AsyncQueryHandler {

QueryHandler(ContentResolver res) {

super(res);//[这里让AsyncQueryHandler和ContentResolver联系起来]

}

@Override

protected void onQueryComplete(int token, Object cookie, Cursor cursor)//监听QueryComplete事件

{

mActivity.init(cursor);

}

}

AsyncQueryHandler--->当contentProvied发生变化时候同步更新显示就可以通过使用AsyncQueryHandler类来达到这一要求

上面的代码--->onQueryComplete()--->就是当cursor更新完之后的

public void init(Cursor c) {

mAdapter.changeCursor(c);

if (mQueryCursor == null) {

MusicUtils.displayDatabaseError(this);

setListAdapter(null);

mReScanHandler.sendEmptyMessageDelayed(0, 1000);

}

MusicUtils.hideDatabaseError(this);

}

实例2:

package com.android.phone;

import static android.view.Window.PROGRESS_VISIBILITY_OFF;

import static android.view.Window.PROGRESS_VISIBILITY_ON;

import android.app.ListActivity;

import android.content.AsyncQueryHandler;

import android.content.ContentResolver;

import android.content.Intent;

import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;

import android.util.Log;

import android.view.Window;

import android.widget.CursorAdapter;

import android.widget.SimpleCursorAdapter;

import android.widget.TextView;

/**

* ADN List activity for the Phone app.

*/

public class ADNList extends ListActivity {

protected static final String TAG = "ADNList";

protected static final boolean DBG = false;

private static final String[] COLUMN_NAMES = new String[] {

"name",

"number"

};

protected static final int NAME_COLUMN = 0;

protected static final int NUMBER_COLUMN = 1;

private static final int[] VIEW_NAMES = new int[] {

android.R.id.text1,

android.R.id.text2

};

protected static final int QUERY_TOKEN = 0;

protected static final int INSERT_TOKEN = 1;

protected static final int UPDATE_TOKEN = 2;

protected static final int DELETE_TOKEN = 3;

protected QueryHandler mQueryHandler;

protected CursorAdapter mCursorAdapter;

protected Cursor mCursor = null;

private TextView mEmptyText;

protected int mInitialSelection = -1;

@Override

protected void onCreate(Bundle icicle) {

super.onCreate(icicle);

getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

setContentView(R.layout.adn_list);

mEmptyText = (TextView) findViewById(android.R.id.empty);

mQueryHandler = new QueryHandler(getContentResolver());

}

@Override

protected void onResume() {

super.onResume();

query();

}

@Override

protected void onStop() {

super.onStop();

if (mCursor != null) {

mCursor.deactivate();

}

}

protected Uri resolveIntent() {

Intent intent = getIntent();

if (intent.getData() == null) {

intent.setData(Uri.parse("content://icc/adn"));

}

return intent.getData();

}

private void query() {

Uri uri = resolveIntent();

if (DBG) log("query: starting an async query");

mQueryHandler.startQuery(QUERY_TOKEN, null, uri, COLUMN_NAMES,

null, null, null);

displayProgress(true);

}

private void reQuery() {

query();

}

private void setAdapter() {

if (mCursorAdapter == null) {

mCursorAdapter = newAdapter();

setListAdapter(mCursorAdapter);

} else {

mCursorAdapter.changeCursor(mCursor);

}

if (mInitialSelection >=0 && mInitialSelection < mCursorAdapter.getCount()) {

setSelection(mInitialSelection);

getListView().setFocusableInTouchMode(true);

boolean gotfocus = getListView().requestFocus();

}

}

protected CursorAdapter newAdapter() {

return new SimpleCursorAdapter(this,

android.R.layout.simple_list_item_2,

mCursor, COLUMN_NAMES, VIEW_NAMES);

}

private void displayProgress(boolean flag) {

if (DBG) log("displayProgress: " + flag);

mEmptyText.setText(flag ? R.string.simContacts_emptyLoading: R.string.simContacts_empty);

getWindow().setFeatureInt(

Window.FEATURE_INDETERMINATE_PROGRESS,

flag ? PROGRESS_VISIBILITY_ON : PROGRESS_VISIBILITY_OFF);

}

private class QueryHandler extends AsyncQueryHandler {

public QueryHandler(ContentResolver cr) {

super(cr);

}

@Override

protected void onQueryComplete(int token, Object cookie, Cursor c) {//监听QueryComplete事件

if (DBG) log("onQueryComplete: cursor.count=" + c.getCount());

mCursor = c;

setAdapter();

displayProgress(false);

?

@Override

protected void onInsertComplete(int token, Object cookie,//监听InsertComplete事件

Uri uri) {

if (DBG) log("onInsertComplete: requery");

reQuery();

}

@Override

protected void onUpdateComplete(int token, Object cookie, int result) {//监听onUpdateComplete事件

if (DBG) log("onUpdateComplete: requery");

reQuery();

}

@Override

protected void onDeleteComplete(int token, Object cookie, int result) {//监听DeleteComplete事件

if (DBG) log("onDeleteComplete: requery");

reQuery();

}

}

protected void log(String msg) {

Log.d(TAG, "[ADNList] " + msg);

}

}

同时可参考:/content/2873995.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: