diff options
| author | Zemiao Zhu <zemiao@google.com> | 2021-01-06 15:53:07 -0800 |
|---|---|---|
| committer | Zemiao Zhu <zemiao@google.com> | 2021-01-06 17:22:37 -0800 |
| commit | a4005b9a27243a47c298fe302b39879070b9cdc8 (patch) | |
| tree | 2277a026adb0fe277c46aa46cf3e03b178a71fb4 /src | |
| parent | 47e3f4f17bb1939132c678d97339d4b9592eb1dc (diff) | |
| download | platform_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.java | 15 |
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 |
