aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/java/com/android/volley/AsyncNetwork.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/java/com/android/volley/AsyncNetwork.java')
-rw-r--r--core/src/main/java/com/android/volley/AsyncNetwork.java145
1 files changed, 145 insertions, 0 deletions
diff --git a/core/src/main/java/com/android/volley/AsyncNetwork.java b/core/src/main/java/com/android/volley/AsyncNetwork.java
new file mode 100644
index 0000000..47f35ea
--- /dev/null
+++ b/core/src/main/java/com/android/volley/AsyncNetwork.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2020 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 com.android.volley;
+
+import androidx.annotation.RestrictTo;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * An asynchronous implementation of {@link Network} to perform requests.
+ *
+ * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see
+ * https://github.com/google/volley/wiki/Asynchronous-Volley for more details.
+ */
+public abstract class AsyncNetwork implements Network {
+ private ExecutorService mBlockingExecutor;
+ private ExecutorService mNonBlockingExecutor;
+ private ScheduledExecutorService mNonBlockingScheduledExecutor;
+
+ protected AsyncNetwork() {}
+
+ /** Interface for callback to be called after request is processed. */
+ public interface OnRequestComplete {
+ /** Method to be called after successful network request. */
+ void onSuccess(NetworkResponse networkResponse);
+
+ /** Method to be called after unsuccessful network request. */
+ void onError(VolleyError volleyError);
+ }
+
+ /**
+ * Non-blocking method to perform the specified request.
+ *
+ * @param request Request to process
+ * @param callback to be called once NetworkResponse is received
+ */
+ public abstract void performRequest(Request<?> request, OnRequestComplete callback);
+
+ /**
+ * Blocking method to perform network request.
+ *
+ * @param request Request to process
+ * @return response retrieved from the network
+ * @throws VolleyError in the event of an error
+ */
+ @Override
+ public NetworkResponse performRequest(Request<?> request) throws VolleyError {
+ final CountDownLatch latch = new CountDownLatch(1);
+ final AtomicReference<NetworkResponse> response = new AtomicReference<>();
+ final AtomicReference<VolleyError> error = new AtomicReference<>();
+ performRequest(
+ request,
+ new OnRequestComplete() {
+ @Override
+ public void onSuccess(NetworkResponse networkResponse) {
+ response.set(networkResponse);
+ latch.countDown();
+ }
+
+ @Override
+ public void onError(VolleyError volleyError) {
+ error.set(volleyError);
+ latch.countDown();
+ }
+ });
+ try {
+ latch.await();
+ } catch (InterruptedException e) {
+ VolleyLog.e(e, "while waiting for CountDownLatch");
+ Thread.currentThread().interrupt();
+ throw new VolleyError(e);
+ }
+
+ if (response.get() != null) {
+ return response.get();
+ } else if (error.get() != null) {
+ throw error.get();
+ } else {
+ throw new VolleyError("Neither response entry was set");
+ }
+ }
+
+ /**
+ * This method sets the non blocking executor to be used by the network for non-blocking tasks.
+ *
+ * <p>This method must be called before performing any requests.
+ */
+ @RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
+ public void setNonBlockingExecutor(ExecutorService executor) {
+ mNonBlockingExecutor = executor;
+ }
+
+ /**
+ * This method sets the blocking executor to be used by the network for potentially blocking
+ * tasks.
+ *
+ * <p>This method must be called before performing any requests.
+ */
+ @RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
+ public void setBlockingExecutor(ExecutorService executor) {
+ mBlockingExecutor = executor;
+ }
+
+ /**
+ * This method sets the scheduled executor to be used by the network for non-blocking tasks to
+ * be scheduled.
+ *
+ * <p>This method must be called before performing any requests.
+ */
+ @RestrictTo({RestrictTo.Scope.LIBRARY_GROUP})
+ public void setNonBlockingScheduledExecutor(ScheduledExecutorService executor) {
+ mNonBlockingScheduledExecutor = executor;
+ }
+
+ /** Gets blocking executor to perform any potentially blocking tasks. */
+ protected ExecutorService getBlockingExecutor() {
+ return mBlockingExecutor;
+ }
+
+ /** Gets non-blocking executor to perform any non-blocking tasks. */
+ protected ExecutorService getNonBlockingExecutor() {
+ return mNonBlockingExecutor;
+ }
+
+ /** Gets scheduled executor to perform any non-blocking tasks that need to be scheduled. */
+ protected ScheduledExecutorService getNonBlockingScheduledExecutor() {
+ return mNonBlockingScheduledExecutor;
+ }
+}