summaryrefslogtreecommitdiffstats
path: root/core/java/android/database/sqlite/SQLiteCursor.java
diff options
context:
space:
mode:
authorMakoto Onuki <omakoto@google.com>2010-04-29 11:26:20 -0700
committerMakoto Onuki <omakoto@google.com>2010-04-29 11:36:48 -0700
commit2589716964f99fd0ee29a9b295584c277e23f34f (patch)
treecccba9c2fd6133390494f051583aeb93cc93b3bb /core/java/android/database/sqlite/SQLiteCursor.java
parent286fbce557fa5b027ffb3c5a5b562bfc5a3b4748 (diff)
downloadframeworks_base-2589716964f99fd0ee29a9b295584c277e23f34f.zip
frameworks_base-2589716964f99fd0ee29a9b295584c277e23f34f.tar.gz
frameworks_base-2589716964f99fd0ee29a9b295584c277e23f34f.tar.bz2
Make RequeryOnUiThreadException warning less spamy
- Moved the thread check from AbstractCursor to SQLiteCursor. - Show warning only once per database Bug 2633883 Change-Id: I915bfba8715a469c45fb68ba1282231279f2a50c
Diffstat (limited to 'core/java/android/database/sqlite/SQLiteCursor.java')
-rw-r--r--core/java/android/database/sqlite/SQLiteCursor.java28
1 files changed, 27 insertions, 1 deletions
diff --git a/core/java/android/database/sqlite/SQLiteCursor.java b/core/java/android/database/sqlite/SQLiteCursor.java
index 6e5b3e1..fea3438 100644
--- a/core/java/android/database/sqlite/SQLiteCursor.java
+++ b/core/java/android/database/sqlite/SQLiteCursor.java
@@ -16,12 +16,14 @@
package android.database.sqlite;
+import android.app.ActivityThread;
import android.database.AbstractWindowedCursor;
import android.database.CursorWindow;
import android.database.DataSetObserver;
+import android.database.RequeryOnUiThreadException;
import android.database.SQLException;
-
import android.os.Handler;
+import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.text.TextUtils;
@@ -74,6 +76,11 @@ public class SQLiteCursor extends AbstractWindowedCursor {
private int mCursorState = 0;
private ReentrantLock mLock = null;
private boolean mPendingData = false;
+
+ /**
+ * Used by {@link #requery()} to remember for which database we've already shown the warning.
+ */
+ private static final HashMap<String, Boolean> sAlreadyWarned = new HashMap<String, Boolean>();
/**
* support for a cursor variant that doesn't always read all results
@@ -503,11 +510,30 @@ public class SQLiteCursor extends AbstractWindowedCursor {
mDriver.cursorClosed();
}
+ /**
+ * Show a warning against the use of requery() if called on the main thread.
+ * This warning is shown per database per process.
+ */
+ private void warnIfUiThread() {
+ if (Looper.getMainLooper() == Looper.myLooper()) {
+ String databasePath = mDatabase.getPath();
+ // We show the warning once per database in order not to spam logcat.
+ if (!sAlreadyWarned.containsKey(databasePath)) {
+ sAlreadyWarned.put(databasePath, true);
+ String packageName = ActivityThread.currentPackageName();
+ Log.w(TAG, "should not attempt requery on main (UI) thread: app = " +
+ packageName == null ? "'unknown'" : packageName,
+ new RequeryOnUiThreadException(packageName));
+ }
+ }
+ }
+
@Override
public boolean requery() {
if (isClosed()) {
return false;
}
+ warnIfUiThread();
long timeStart = 0;
if (Config.LOGV) {
timeStart = System.currentTimeMillis();