From 421fa2744556d6483007bc2a6a1e4030811142f9 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Sun, 9 Oct 2011 12:37:57 -0700 Subject: [PATCH] Fix issue #5418999: [From My Phone] - ANR when navigating back from OneUp view Close cursors asynchronously. Change-Id: I32c106d26c0443710789344bf823c288eaf31db5 --- core/java/android/content/CursorLoader.java | 22 +++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/core/java/android/content/CursorLoader.java b/core/java/android/content/CursorLoader.java index 6228bd059f2d7..50919d52d82d1 100644 --- a/core/java/android/content/CursorLoader.java +++ b/core/java/android/content/CursorLoader.java @@ -19,6 +19,7 @@ package android.content; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; +import android.os.AsyncTask; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -49,6 +50,19 @@ public class CursorLoader extends AsyncTaskLoader { Cursor mCursor; + final static class CloseTask extends AsyncTask { + @Override + protected Void doInBackground(Cursor... params) { + params[0].close(); + return null; + } + } + + static void closeAsync(Cursor cursor) { + CloseTask closeTask = new CloseTask(); + closeTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, cursor); + } + /* Runs on a worker thread */ @Override public Cursor loadInBackground() { @@ -76,7 +90,7 @@ public class CursorLoader extends AsyncTaskLoader { if (isReset()) { // An async query came in while the loader is stopped if (cursor != null) { - cursor.close(); + closeAsync(cursor); } return; } @@ -88,7 +102,7 @@ public class CursorLoader extends AsyncTaskLoader { } if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) { - oldCursor.close(); + closeAsync(oldCursor); } } @@ -148,7 +162,7 @@ public class CursorLoader extends AsyncTaskLoader { @Override public void onCanceled(Cursor cursor) { if (cursor != null && !cursor.isClosed()) { - cursor.close(); + closeAsync(cursor); } } @@ -160,7 +174,7 @@ public class CursorLoader extends AsyncTaskLoader { onStopLoading(); if (mCursor != null && !mCursor.isClosed()) { - mCursor.close(); + closeAsync(mCursor); } mCursor = null; }