• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 package org.chromium.base.task;
6 
7 import android.os.Handler;
8 
9 /**
10  * This {@link TaskExecutor} is for tasks posted with UI Thread {@link TaskTraits}. It maps to
11  * content::BrowserTaskExecutor in C++, except that in Java the UI thread is a base/ concept and
12  * only UI thread posting is supported.
13  */
14 public class UiThreadTaskExecutor implements TaskExecutor {
15     private static boolean sRegistered;
16 
17     private final SingleThreadTaskRunner mBestEffortTaskRunner;
18     private final SingleThreadTaskRunner mUserVisibleTaskRunner;
19     private final SingleThreadTaskRunner mUserBlockingTaskRunner;
20 
UiThreadTaskExecutor(Handler handler)21     public UiThreadTaskExecutor(Handler handler) {
22         mBestEffortTaskRunner = new SingleThreadTaskRunnerImpl(handler, TaskTraits.UI_BEST_EFFORT);
23         mUserVisibleTaskRunner =
24                 new SingleThreadTaskRunnerImpl(handler, TaskTraits.UI_USER_VISIBLE);
25         mUserBlockingTaskRunner =
26                 new SingleThreadTaskRunnerImpl(handler, TaskTraits.UI_USER_BLOCKING);
27     }
28 
29     @Override
createTaskRunner(@askTraits int taskTraits)30     public TaskRunner createTaskRunner(@TaskTraits int taskTraits) {
31         return createSingleThreadTaskRunner(taskTraits);
32     }
33 
34     @Override
createSequencedTaskRunner(@askTraits int taskTraits)35     public SequencedTaskRunner createSequencedTaskRunner(@TaskTraits int taskTraits) {
36         return createSingleThreadTaskRunner(taskTraits);
37     }
38 
39     @Override
createSingleThreadTaskRunner(@askTraits int taskTraits)40     public SingleThreadTaskRunner createSingleThreadTaskRunner(@TaskTraits int taskTraits) {
41         if (TaskTraits.UI_BEST_EFFORT == taskTraits) {
42             return mBestEffortTaskRunner;
43         } else if (TaskTraits.UI_USER_VISIBLE == taskTraits) {
44             return mUserVisibleTaskRunner;
45         } else if (TaskTraits.UI_USER_BLOCKING == taskTraits) {
46             return mUserBlockingTaskRunner;
47         } else {
48             // Add support for additional TaskTraits here if encountering this exception.
49             throw new RuntimeException();
50         }
51     }
52 
53     @Override
postDelayedTask(@askTraits int taskTraits, Runnable task, long delay)54     public void postDelayedTask(@TaskTraits int taskTraits, Runnable task, long delay) {
55         createSingleThreadTaskRunner(taskTraits).postDelayedTask(task, delay);
56     }
57 
58     @Override
canRunTaskImmediately(@askTraits int traits)59     public boolean canRunTaskImmediately(@TaskTraits int traits) {
60         return createSingleThreadTaskRunner(traits).belongsToCurrentThread();
61     }
62 }
63