Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25897169 authored by Makoto Onuki's avatar Makoto Onuki
Browse files

Make RequeryOnUiThreadException warning less spamy

- Moved the thread check from AbstractCursor to SQLiteCursor.
- Show warning only once per database

Bug 2633883

Change-Id: I915bfba8715a469c45fb68ba1282231279f2a50c
parent 286fbce5
Loading
Loading
Loading
Loading
+1 −13
Original line number Diff line number Diff line
@@ -16,17 +16,13 @@

package android.database;

import android.app.ActivityThread;
import android.content.ContentResolver;
import android.net.Uri;
import android.os.Bundle;
import android.util.Config;
import android.util.Log;
import android.os.Bundle;
import android.os.Looper;
import android.os.Process;

import java.lang.ref.WeakReference;
import java.lang.UnsupportedOperationException;
import java.util.HashMap;
import java.util.Map;

@@ -89,14 +85,6 @@ public abstract class AbstractCursor implements CrossProcessCursor {
    }

    public boolean requery() {
        // print a warning if this method is being called from Main (UI) thread
        if (Looper.getMainLooper() == Looper.myLooper()) {
            // yes this is UI thread.
            String packageName = ActivityThread.currentPackageName();
            Log.w(TAG, "should not attempt requery on main (UI) thread: app = " +
                    packageName == null ? "'unknown'" : packageName,
                    new RequeryOnUiThreadException(packageName));
        }
        if (mSelfObserver != null && mSelfObserverRegistered == false) {
            mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver);
            mSelfObserverRegistered = true;
+27 −1
Original line number Diff line number Diff line
@@ -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;
@@ -75,6 +77,11 @@ public class SQLiteCursor extends AbstractWindowedCursor {
    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
     *  initialRead is the initial number of items that cursor window reads 
@@ -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();