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

Commit bef9c7a5 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Preventing cursor leaks when a query is interrupted

Re-ran runtest cts-os

Change-Id: I518a2a4f842b01d082078e16643aa377a4575237
parent ce718947
Loading
Loading
Loading
Loading
+24 −5
Original line number Diff line number Diff line
@@ -25,10 +25,14 @@ import android.os.AsyncTask;
 */
public abstract class AsyncTaskLoader<D> extends Loader<D> {
    final class LoadTask extends AsyncTask<Void, Void, D> {

        private D result;

        /* Runs on a worker thread */
        @Override
        protected D doInBackground(Void... params) {
            return AsyncTaskLoader.this.loadInBackground();
            result = AsyncTaskLoader.this.loadInBackground();
            return result;
        }

        /* Runs on the UI thread */
@@ -36,6 +40,11 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
        protected void onPostExecute(D data) {
            AsyncTaskLoader.this.dispatchOnLoadComplete(data);
        }

        @Override
        protected void onCancelled() {
            AsyncTaskLoader.this.onCancelled(result);
        }
    }

    LoadTask mTask;
@@ -50,6 +59,7 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
     */
    @Override
    public void forceLoad() {
        cancelLoad();
        mTask = new LoadTask();
        mTask.execute((Void[]) null);
    }
@@ -65,11 +75,20 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> {
     */
    public boolean cancelLoad() {
        if (mTask != null) {
            return mTask.cancel(false);
            boolean cancelled = mTask.cancel(false);
            mTask = null;
            return cancelled;
        }
        return false;
    }

    /**
     * Called if the task was canceled before it was completed.  Gives the class a chance
     * to properly dispose of the result.
     */
    public void onCancelled(D data) {
    }

    void dispatchOnLoadComplete(D data) {
        mTask = null;
        deliverResult(data);
+8 −1
Original line number Diff line number Diff line
@@ -103,6 +103,13 @@ public class CursorLoader extends AsyncTaskLoader<Cursor> {
        mStopped = true;
    }

    @Override
    public void onCancelled(Cursor cursor) {
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
    }

    @Override
    public void destroy() {
        // Ensure the loader is stopped
+12 −1
Original line number Diff line number Diff line
@@ -187,6 +187,17 @@ public abstract class AsyncTask<Params, Progress, Result> {
        };

        mFuture = new FutureTask<Result>(mWorker) {

            @Override
            protected void set(Result v) {
                super.set(v);
                if (isCancelled()) {
                    Message message = sHandler.obtainMessage(MESSAGE_POST_CANCEL,
                            new AsyncTaskResult<Result>(AsyncTask.this, (Result[]) null));
                    message.sendToTarget();
                }
            }

            @Override
            protected void done() {
                Message message;