aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/android/volley/AsyncNetwork.java
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-15 21:47:10 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-15 21:47:10 +0000
commit0bacdaec55cb5c0bf5ae8aef1c8fac917241e20c (patch)
treebafe6d115be2559d39c73bfd437bb9d14e3d596a /src/main/java/com/android/volley/AsyncNetwork.java
parent5852725ee5bc9f5310ef05f2ca7d8207dc6aab47 (diff)
parent5731f9f9aea90e074693bdfdeb3b58fd218e374d (diff)
downloadvolley-b9dbb0936111acd56701e8c7aee2d2b80bfabc74.tar.gz
Change-Id: I13e53f2c5a35a1ead2356b12d78400ef75b96057
Diffstat (limited to 'src/main/java/com/android/volley/AsyncNetwork.java')
-rw-r--r--src/main/java/com/android/volley/AsyncNetwork.java140
1 files changed, 140 insertions, 0 deletions
diff --git a/src/main/java/com/android/volley/AsyncNetwork.java b/src/main/java/com/android/volley/AsyncNetwork.java
new file mode 100644
index 0000000..ad19c03
--- /dev/null
+++ b/src/main/java/com/android/volley/AsyncNetwork.java
@@ -0,0 +1,140 @@
+/*
+ * 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. */
+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;
+ }
+}