summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2017-05-26 00:45:38 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-05-26 00:45:42 +0000
commit58f6f428fcd056d888c76da56eeb7dc4ea2e52ab (patch)
tree2780475708b780861cf0500f34553cf2082b656d
parent7f874db5aa9765a4ffb068066425f7527a9c9457 (diff)
parent1488a3a19d4681a41fb45570c15e14d99db1cb66 (diff)
Merge "SelectionActionModeHelper should use target view's thread" into oc-dev
-rw-r--r--core/java/android/os/AsyncTask.java40
-rw-r--r--core/java/android/widget/SelectionActionModeHelper.java4
2 files changed, 37 insertions, 7 deletions
diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java
index fea64ec5ee1e..141d33bc4145 100644
--- a/core/java/android/os/AsyncTask.java
+++ b/core/java/android/os/AsyncTask.java
@@ -17,14 +17,14 @@
package android.os;
import android.annotation.MainThread;
+import android.annotation.Nullable;
import android.annotation.WorkerThread;
-
import java.util.ArrayDeque;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
-import java.util.concurrent.Executor;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
import java.util.concurrent.FutureTask;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
@@ -232,6 +232,8 @@ public abstract class AsyncTask<Params, Progress, Result> {
private final AtomicBoolean mCancelled = new AtomicBoolean();
private final AtomicBoolean mTaskInvoked = new AtomicBoolean();
+ private final Handler mHandler;
+
private static class SerialExecutor implements Executor {
final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
Runnable mActive;
@@ -277,15 +279,19 @@ public abstract class AsyncTask<Params, Progress, Result> {
FINISHED,
}
- private static Handler getHandler() {
+ private static Handler getMainHandler() {
synchronized (AsyncTask.class) {
if (sHandler == null) {
- sHandler = new InternalHandler();
+ sHandler = new InternalHandler(Looper.getMainLooper());
}
return sHandler;
}
}
+ private Handler getHandler() {
+ return mHandler;
+ }
+
/** @hide */
public static void setDefaultExecutor(Executor exec) {
sDefaultExecutor = exec;
@@ -295,6 +301,28 @@ public abstract class AsyncTask<Params, Progress, Result> {
* Creates a new asynchronous task. This constructor must be invoked on the UI thread.
*/
public AsyncTask() {
+ this((Looper) null);
+ }
+
+ /**
+ * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
+ *
+ * @hide
+ */
+ public AsyncTask(@Nullable Handler handler) {
+ this(handler != null ? handler.getLooper() : null);
+ }
+
+ /**
+ * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
+ *
+ * @hide
+ */
+ public AsyncTask(@Nullable Looper callbackLooper) {
+ mHandler = callbackLooper == null || callbackLooper == Looper.getMainLooper()
+ ? getMainHandler()
+ : new Handler(callbackLooper);
+
mWorker = new WorkerRunnable<Params, Result>() {
public Result call() throws Exception {
mTaskInvoked.set(true);
@@ -670,8 +698,8 @@ public abstract class AsyncTask<Params, Progress, Result> {
}
private static class InternalHandler extends Handler {
- public InternalHandler() {
- super(Looper.getMainLooper());
+ public InternalHandler(Looper looper) {
+ super(looper);
}
@SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 6657c3a78a20..142412ac8ccb 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -74,8 +74,9 @@ final class SelectionActionModeHelper {
startActionMode(null);
} else {
resetTextClassificationHelper(true /* resetSelectionTag */);
+ final TextView tv = mEditor.getTextView();
mTextClassificationAsyncTask = new TextClassificationAsyncTask(
- mEditor.getTextView(),
+ tv,
TIMEOUT_DURATION,
adjustSelection
? mTextClassificationHelper::suggestSelection
@@ -340,6 +341,7 @@ final class SelectionActionModeHelper {
@NonNull TextView textView, int timeOut,
@NonNull Supplier<SelectionResult> selectionResultSupplier,
@NonNull Consumer<SelectionResult> selectionResultCallback) {
+ super(textView != null ? textView.getHandler() : null);
mTextView = Preconditions.checkNotNull(textView);
mTimeOutDuration = timeOut;
mSelectionResultSupplier = Preconditions.checkNotNull(selectionResultSupplier);