Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
package bolts;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Represents the result of an asynchronous operation.
*
* @param
* The type of the result of the task.
*/
public class Task {
/**
* An {@link java.util.concurrent.Executor} that executes tasks in parallel.
*/
public static final ExecutorService BACKGROUND_EXECUTOR = BoltsExecutors.background();
/**
* An {@link java.util.concurrent.Executor} that executes tasks in the current thread unless
* the stack runs too deep, at which point it will delegate to {@link Task#BACKGROUND_EXECUTOR} in
* order to trim the stack.
*/
private static final Executor IMMEDIATE_EXECUTOR = BoltsExecutors.immediate();
/**
* An {@link java.util.concurrent.Executor} that executes tasks on the UI thread.
*/
public static final Executor UI_THREAD_EXECUTOR = AndroidExecutors.uiThread();
private final Object lock = new Object();
private boolean complete;
private boolean cancelled;
private TResult result;
private Exception error;
private List> continuations = new ArrayList<>();
/* package */ Task() {
}
private Task(TResult result) {
trySetResult(result);
}
private Task(boolean cancelled) {
if (cancelled) {
trySetCancelled();
} else {
trySetResult(null);
}
}
/**
* @deprecated Please use {@link bolts.TaskCompletionSource()} instead.
*/
public static Task.TaskCompletionSource create() {
Task task = new Task<>();
return task.new TaskCompletionSource();
}
/**
* @return {@code true} if the task completed (has a result, an error, or was cancelled.
* {@code false} otherwise.
*/
public boolean isCompleted() {
synchronized (lock) {
return complete;
}
}
/**
* @return {@code true} if the task was cancelled, {@code false} otherwise.
*/
public boolean isCancelled() {
synchronized (lock) {
return cancelled;
}
}
/**
* @return {@code true} if the task has an error, {@code false} otherwise.
*/
public boolean isFaulted() {
synchronized (lock) {
return error != null;
}
}
/**
* @return The result of the task, if set. {@code null} otherwise.
*/
public TResult getResult() {
synchronized (lock) {
return result;
}
}
/**
* @return The error for the task, if set. {@code null} otherwise.
*/
public Exception getError() {
synchronized (lock) {
return error;
}
}
/**
* Blocks until the task is complete.
*/
public void waitForCompletion() throws InterruptedException {
synchronized (lock) {
if (!isCompleted()) {
lock.wait();
}
}
}
/**
* Creates a completed task with the given value.
*/
@SuppressWarnings("unchecked")
public static Task forResult(TResult value) {
if (value == null) {
return (Task) TASK_NULL;
}
if (value instanceof Boolean) {
return (Task) ((Boolean) value ? TASK_TRUE : TASK_FALSE);
}
bolts.TaskCompletionSource tcs = new bolts.TaskCompletionSource<>();
tcs.setResult(value);
return tcs.getTask();
}
/**
* Creates a faulted task with the given error.
*/
public static Task forError(Exception error) {
bolts.TaskCompletionSource tcs = new bolts.TaskCompletionSource<>();
tcs.setError(error);
return tcs.getTask();
}
/**
* Creates a cancelled task.
*/
@SuppressWarnings("unchecked")
public static Task cancelled() {
return (Task) TASK_CANCELLED;
}
/**
* Creates a task that completes after a time delay.
*
* @param delay The number of milliseconds to wait before completing the returned task. Zero and
* negative values are treated as requests for immediate execution.
*/
public static Task delay(long delay) {
return delay(delay, BoltsExecutors.scheduled(), null);
}
/**
* Creates a task that completes after a time delay.
*
* @param delay The number of milliseconds to wait before completing the returned task. Zero and
* negative values are treated as requests for immediate execution.
* @param cancellationToken The optional cancellation token that will be checked prior to
* completing the returned task.
*/
public static Task delay(long delay, CancellationToken cancellationToken) {
return delay(delay, BoltsExecutors.scheduled(), cancellationToken);
}
/* package */ static Task delay(long delay, ScheduledExecutorService executor, final CancellationToken cancellationToken) {
if (cancellationToken != null && cancellationToken.isCancellationRequested()) {
return Task.cancelled();
}
if (delay <= 0) {
return Task.forResult(null);
}
final bolts.TaskCompletionSource tcs = new bolts.TaskCompletionSource<>();
final ScheduledFuture> scheduled = executor.schedule(new Runnable() {
@Override
public void run() {
tcs.trySetResult(null);
}
}, delay, TimeUnit.MILLISECONDS);
if (cancellationToken != null) {
cancellationToken.register(new Runnable() {
@Override
public void run() {
scheduled.cancel(true);
tcs.trySetCancelled();
}
});
}
return tcs.getTask();
}
/**
* Makes a fluent cast of a Task's result possible, avoiding an extra continuation just to cast
* the type of the result.
*/
public Task cast() {
@SuppressWarnings("unchecked")
Task task = (Task) this;
return task;
}
/**
* Turns a Task into a Task, dropping any result.
*/
public Task makeVoid() {
return this.continueWithTask(new Continuation>() {
@Override
public Task then(Task task) throws Exception {
if (task.isCancelled()) {
return Task.cancelled();
}
if (task.isFaulted()) {
return Task.forError(task.getError());
}
return Task.forResult(null);
}
});
}
/**
* Invokes the callable on a background thread, returning a Task to represent the operation.
*
* If you want to cancel the resulting Task throw a {@link java.util.concurrent.CancellationException}
* from the callable.
*/
public static Task callInBackground(Callable callable) {
return call(callable, BACKGROUND_EXECUTOR, null);
}
/**
* Invokes the callable on a background thread, returning a Task to represent the operation.
*/
public static Task callInBackground(Callable callable, CancellationToken ct) {
return call(callable, BACKGROUND_EXECUTOR, ct);
}
/**
* Invokes the callable using the given executor, returning a Task to represent the operation.
*
* If you want to cancel the resulting Task throw a {@link java.util.concurrent.CancellationException}
* from the callable.
*/
public static Task call(final Callable callable, Executor executor) {
return call(callable, executor, null);
}
/**
* Invokes the callable using the given executor, returning a Task to represent the operation.
*/
public static Task call(final Callable callable, Executor executor,
final CancellationToken ct) {
final bolts.TaskCompletionSource tcs = new bolts.TaskCompletionSource<>();
executor.execute(new Runnable() {
@Override
public void run() {
if (ct != null && ct.isCancellationRequested()) {
tcs.setCancelled();
return;
}
try {
tcs.setResult(callable.call());
} catch (CancellationException e) {
tcs.setCancelled();
} catch (Exception e) {
tcs.setError(e);
}
}
});
return tcs.getTask();
}
/**
* Invokes the callable on the current thread, producing a Task.
*
* If you want to cancel the resulting Task throw a {@link java.util.concurrent.CancellationException}
* from the callable.
*/
public static Task call(final Callable callable) {
return call(callable, IMMEDIATE_EXECUTOR, null);
}
/**
* Invokes the callable on the current thread, producing a Task.
*/
public static Task call(final Callable callable, CancellationToken ct) {
return call(callable, IMMEDIATE_EXECUTOR, ct);
}
/**
* Creates a task that will complete when any of the supplied tasks have completed.
*
* The returned task will complete when any of the supplied tasks has completed. The returned task
* will always end in the completed state with its result set to the first task to complete. This
* is true even if the first task to complete ended in the canceled or faulted state.
*
* @param tasks
* The tasks to wait on for completion.
* @return A task that represents the completion of one of the supplied tasks.
* The return task's result is the task that completed.
*/
public static Task> whenAnyResult(Collection extends Task> tasks) {
if (tasks.size() == 0) {
return Task.forResult(null);
}
final bolts.TaskCompletionSource> firstCompleted = new bolts.TaskCompletionSource<>();
final AtomicBoolean isAnyTaskComplete = new AtomicBoolean(false);
for (Task task : tasks) {
task.continueWith(new Continuation() {
@Override
public Void then(Task task) {
if (isAnyTaskComplete.compareAndSet(false, true)) {
firstCompleted.setResult(task);
}
return null;
}
});
}
return firstCompleted.getTask();
}
/**
* Creates a task that will complete when any of the supplied tasks have completed.
*
* The returned task will complete when any of the supplied tasks has completed. The returned task
* will always end in the completed state with its result set to the first task to complete. This
* is true even if the first task to complete ended in the canceled or faulted state.
*
* @param tasks
* The tasks to wait on for completion.
* @return A task that represents the completion of one of the supplied tasks.
* The return task's Result is the task that completed.
*/
@SuppressWarnings("unchecked")
public static Task> whenAny(Collection extends Task>> tasks) {
if (tasks.size() == 0) {
return Task.forResult(null);
}
final bolts.TaskCompletionSource> firstCompleted = new bolts.TaskCompletionSource<>();
final AtomicBoolean isAnyTaskComplete = new AtomicBoolean(false);
for (Task> task : tasks) {
((Task