blob: a9716838a12cc0cd29fafa9b118ec3678bd34a1a [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.task;
import android.os.Handler;
import androidx.annotation.Nullable;
import org.jni_zero.JNINamespace;
/**
* Implementation of the abstract class {@link SingleThreadTaskRunner}. Before native initialization
* tasks are posted to the {@link java android.os.Handler}, after native initialization they're
* posted to a base::SingleThreadTaskRunner which runs on the same thread.
*/
@JNINamespace("base")
public class SingleThreadTaskRunnerImpl extends TaskRunnerImpl implements SingleThreadTaskRunner {
@Nullable private final Handler mHandler;
/**
* @param handler The backing Handler if any. Note this must run tasks on the
* same thread that the native code runs a task with |traits|.
* If handler is null then tasks won't run until native has
* initialized.
* @param traits The TaskTraits associated with this SingleThreadTaskRunnerImpl.
*/
public SingleThreadTaskRunnerImpl(Handler handler, @TaskTraits int traits) {
super(traits, "SingleThreadTaskRunnerImpl", TaskRunnerType.SINGLE_THREAD);
mHandler = handler;
}
@Override
public boolean belongsToCurrentThread() {
Boolean belongs = belongsToCurrentThreadInternal();
if (belongs != null) return belongs.booleanValue();
assert mHandler != null;
return mHandler.getLooper().getThread() == Thread.currentThread();
}
@Override
protected void schedulePreNativeTask() {
// if |mHandler| is null then pre-native task execution is not supported.
if (mHandler == null) {
return;
} else {
mHandler.post(mRunPreNativeTaskClosure);
}
}
@Override
protected boolean schedulePreNativeDelayedTask(Runnable task, long delay) {
if (mHandler == null) return false;
// In theory it would be fine to delay these tasks until native is initialized and post them
// to the native task runner, but in practice some tests don't initialize native and still
// expect delayed tasks to eventually run. There's no good reason not to support them here,
// there are so few of these tasks that they're very unlikely to cause performance problems.
mHandler.postDelayed(task, delay);
return true;
}
}