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