summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorZemiao Zhu <zemiao@google.com>2021-01-06 15:53:07 -0800
committerZemiao Zhu <zemiao@google.com>2021-01-06 17:22:37 -0800
commita4005b9a27243a47c298fe302b39879070b9cdc8 (patch)
tree2277a026adb0fe277c46aa46cf3e03b178a71fb4 /src
parent47e3f4f17bb1939132c678d97339d4b9592eb1dc (diff)
downloadplatform_packages_apps_DocumentsUI-a4005b9a27243a47c298fe302b39879070b9cdc8.tar.gz
platform_packages_apps_DocumentsUI-a4005b9a27243a47c298fe302b39879070b9cdc8.tar.bz2
platform_packages_apps_DocumentsUI-a4005b9a27243a47c298fe302b39879070b9cdc8.zip
Fix ANR caused by multiple loaders blocking UI thread.
Fix: 162477640 Test: atest DocumentsUIGoogleTests Change-Id: I384f97ee1c0e69141d6d7f48c3136801ee96a555
Diffstat (limited to 'src')
-rw-r--r--src/com/android/documentsui/AbstractActionHandler.java15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/com/android/documentsui/AbstractActionHandler.java b/src/com/android/documentsui/AbstractActionHandler.java
index 0c612eddd..db56a05df 100644
--- a/src/com/android/documentsui/AbstractActionHandler.java
+++ b/src/com/android/documentsui/AbstractActionHandler.java
@@ -76,6 +76,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Executor;
+import java.util.concurrent.Semaphore;
import java.util.function.Consumer;
import javax.annotation.Nullable;
@@ -94,6 +95,7 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA
private static final String TAG = "AbstractActionHandler";
private static final int REFRESH_SPINNER_TIMEOUT = 500;
+ private final Semaphore mLoaderSemaphore = new Semaphore(1);
protected final T mActivity;
protected final State mState;
@@ -767,7 +769,13 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA
// For RecentsLoader and GlobalSearchLoader, they do not require rootDoc so it is no-op.
// For DirectoryLoader, the loader needs to handle the case when stack.peek() returns null.
- mActivity.getSupportLoaderManager().restartLoader(LOADER_ID, null, mBindings);
+ // Only allow restartLoader when the previous loader is finished or reset. Allowing
+ // multiple consecutive calls to restartLoader() / onCreateLoader() will probably create
+ // multiple active loaders, because restartLoader() does not interrupt previous loaders'
+ // loading, therefore may block the UI thread and cause ANR.
+ if (mLoaderSemaphore.tryAcquire()) {
+ mActivity.getSupportLoaderManager().restartLoader(LOADER_ID, null, mBindings);
+ }
}
protected final boolean launchToDocument(Uri uri) {
@@ -942,10 +950,13 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA
assert(result != null);
mInjector.getModel().update(result);
+ mLoaderSemaphore.release();
}
@Override
- public void onLoaderReset(Loader<DirectoryResult> loader) {}
+ public void onLoaderReset(Loader<DirectoryResult> loader) {
+ mLoaderSemaphore.release();
+ }
}
/**
* A class primarily for the support of isolating our tests