public class

DefaultTaskExecutor

extends TaskExecutor

 java.lang.Object

androidx.arch.core.executor.TaskExecutor

↳androidx.arch.core.executor.DefaultTaskExecutor

Gradle dependencies

compile group: 'androidx.arch.core', name: 'core-runtime', version: '2.2.0'

  • groupId: androidx.arch.core
  • artifactId: core-runtime
  • version: 2.2.0

Artifact androidx.arch.core:core-runtime:2.2.0 it located at Google repository (https://maven.google.com/)

Androidx artifact mapping:

androidx.arch.core:core-runtime android.arch.core:runtime

Androidx class mapping:

androidx.arch.core.executor.DefaultTaskExecutor android.arch.core.executor.DefaultTaskExecutor

Summary

Constructors
publicDefaultTaskExecutor()

Methods
public abstract voidexecuteOnDiskIO(java.lang.Runnable runnable)

Executes the given task in the disk IO thread pool.

public abstract booleanisMainThread()

Returns true if the current thread is the main thread, false otherwise.

public abstract voidpostToMainThread(java.lang.Runnable runnable)

Posts the given task to the main thread.

from TaskExecutorexecuteOnMainThread
from java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Constructors

public DefaultTaskExecutor()

Methods

public abstract void executeOnDiskIO(java.lang.Runnable runnable)

Executes the given task in the disk IO thread pool.

Parameters:

runnable: The runnable to run in the disk IO thread pool.

public abstract void postToMainThread(java.lang.Runnable runnable)

Posts the given task to the main thread.

Parameters:

runnable: The runnable to run on the main thread.

public abstract boolean isMainThread()

Returns true if the current thread is the main thread, false otherwise.

Returns:

true if we are on the main thread, false otherwise.

Source

/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package androidx.arch.core.executor;

import android.os.Build;
import android.os.Handler;
import android.os.Looper;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;

import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @hide
 */
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class DefaultTaskExecutor extends TaskExecutor {

    private final Object mLock = new Object();

    private final ExecutorService mDiskIO = Executors.newFixedThreadPool(4, new ThreadFactory() {
        private static final String THREAD_NAME_STEM = "arch_disk_io_";

        private final AtomicInteger mThreadId = new AtomicInteger(0);

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setName(THREAD_NAME_STEM + mThreadId.getAndIncrement());
            return t;
        }
    });

    @Nullable
    private volatile Handler mMainHandler;

    @Override
    public void executeOnDiskIO(@NonNull Runnable runnable) {
        mDiskIO.execute(runnable);
    }

    @Override
    public void postToMainThread(@NonNull Runnable runnable) {
        if (mMainHandler == null) {
            synchronized (mLock) {
                if (mMainHandler == null) {
                    mMainHandler = createAsync(Looper.getMainLooper());
                }
            }
        }
        //noinspection ConstantConditions
        mMainHandler.post(runnable);
    }

    @Override
    public boolean isMainThread() {
        return Looper.getMainLooper().getThread() == Thread.currentThread();
    }

    @SuppressWarnings("JavaReflectionMemberAccess")
    @NonNull
    private static Handler createAsync(@NonNull Looper looper) {
        if (Build.VERSION.SDK_INT >= 28) {
            return Api28Impl.createAsync(looper);
        } else if (Build.VERSION.SDK_INT >= 17) {
            try {
                // This constructor was added as private in JB MR1:
                // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/jb-mr1-release/core/java/android/os/Handler.java
                return Handler.class.getDeclaredConstructor(Looper.class, Handler.Callback.class,
                        boolean.class)
                        .newInstance(looper, null, true);
            } catch (IllegalAccessException ignored) {
            } catch (InstantiationException ignored) {
            } catch (NoSuchMethodException ignored) {
            } catch (InvocationTargetException e) {
                return new Handler(looper);
            }
        }
        return new Handler(looper);
    }

    @RequiresApi(28)
    private static class Api28Impl {
        private Api28Impl() {
            // Non-instantiable.
        }

        @NonNull
        public static Handler createAsync(@NonNull Looper looper) {
            return Handler.createAsync(looper);
        }
    }
}