summaryrefslogtreecommitdiffstats
path: root/core/java/android/content/AsyncQueryHandler.java
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2008-12-17 18:05:43 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2008-12-17 18:05:43 -0800
commitf013e1afd1e68af5e3b868c26a653bbfb39538f8 (patch)
tree7ad6c8fd9c7b55f4b4017171dec1cb760bbd26bf /core/java/android/content/AsyncQueryHandler.java
parente70cfafe580c6f2994c4827cd8a534aabf3eb05c (diff)
downloadframeworks_base-f013e1afd1e68af5e3b868c26a653bbfb39538f8.zip
frameworks_base-f013e1afd1e68af5e3b868c26a653bbfb39538f8.tar.gz
frameworks_base-f013e1afd1e68af5e3b868c26a653bbfb39538f8.tar.bz2
Code drop from //branches/cupcake/...@124589
Diffstat (limited to 'core/java/android/content/AsyncQueryHandler.java')
-rw-r--r--core/java/android/content/AsyncQueryHandler.java26
1 files changed, 17 insertions, 9 deletions
diff --git a/core/java/android/content/AsyncQueryHandler.java b/core/java/android/content/AsyncQueryHandler.java
index 48f1bc7..2d651a7 100644
--- a/core/java/android/content/AsyncQueryHandler.java
+++ b/core/java/android/content/AsyncQueryHandler.java
@@ -24,6 +24,8 @@ import android.os.Looper;
import android.os.Message;
import android.util.Log;
+import java.lang.ref.WeakReference;
+
/**
* A helper class to help make handling asynchronous {@link ContentResolver}
* queries easier.
@@ -37,7 +39,7 @@ public abstract class AsyncQueryHandler extends Handler {
private static final int EVENT_ARG_UPDATE = 3;
private static final int EVENT_ARG_DELETE = 4;
- /* package */ ContentResolver mResolver;
+ /* package */ final WeakReference<ContentResolver> mResolver;
private static Looper sLooper = null;
@@ -62,18 +64,26 @@ public abstract class AsyncQueryHandler extends Handler {
@Override
public void handleMessage(Message msg) {
+ final ContentResolver resolver = mResolver.get();
+ if (resolver == null) return;
+
WorkerArgs args = (WorkerArgs) msg.obj;
int token = msg.what;
int event = msg.arg1;
-
+
switch (event) {
case EVENT_ARG_QUERY:
Cursor cursor;
try {
- cursor = mResolver.query(args.uri, args.projection,
+ cursor = resolver.query(args.uri, args.projection,
args.selection, args.selectionArgs,
args.orderBy);
+ // Calling getCount() causes the cursor window to be filled,
+ // which will make the first access on the main thread a lot faster.
+ if (cursor != null) {
+ cursor.getCount();
+ }
} catch (Exception e) {
cursor = null;
}
@@ -82,18 +92,16 @@ public abstract class AsyncQueryHandler extends Handler {
break;
case EVENT_ARG_INSERT:
- args.result = mResolver.insert(args.uri, args.values);
+ args.result = resolver.insert(args.uri, args.values);
break;
case EVENT_ARG_UPDATE:
- int r = mResolver.update(args.uri, args.values, args.selection,
+ args.result = resolver.update(args.uri, args.values, args.selection,
args.selectionArgs);
- args.result = new Integer(r);
break;
case EVENT_ARG_DELETE:
- int r2 = mResolver.delete(args.uri, args.selection, args.selectionArgs);
- args.result = new Integer(r2);
+ args.result = resolver.delete(args.uri, args.selection, args.selectionArgs);
break;
}
@@ -115,7 +123,7 @@ public abstract class AsyncQueryHandler extends Handler {
public AsyncQueryHandler(ContentResolver cr) {
super();
- mResolver = cr;
+ mResolver = new WeakReference<ContentResolver>(cr);
synchronized (AsyncQueryHandler.class) {
if (sLooper == null) {
HandlerThread thread = new HandlerThread("AsyncQueryWorker");