diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-15 21:47:10 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-15 21:47:10 +0000 |
commit | 0bacdaec55cb5c0bf5ae8aef1c8fac917241e20c (patch) | |
tree | bafe6d115be2559d39c73bfd437bb9d14e3d596a /src/main/java/com/android/volley/AsyncNetwork.java | |
parent | 5852725ee5bc9f5310ef05f2ca7d8207dc6aab47 (diff) | |
parent | 5731f9f9aea90e074693bdfdeb3b58fd218e374d (diff) | |
download | volley-b9dbb0936111acd56701e8c7aee2d2b80bfabc74.tar.gz |
Snap for 8730993 from 5731f9f9aea90e074693bdfdeb3b58fd218e374d to mainline-tzdata3-releaseaml_tz3_314012070aml_tz3_314012050aml_tz3_314012010aml_tz3_313110000aml_tz3_312511020aml_tz3_312511010aml_tz3_312410020aml_tz3_312410010android12-mainline-tzdata3-releaseaml_tz3_314012010
Change-Id: I13e53f2c5a35a1ead2356b12d78400ef75b96057
Diffstat (limited to 'src/main/java/com/android/volley/AsyncNetwork.java')
-rw-r--r-- | src/main/java/com/android/volley/AsyncNetwork.java | 140 |
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; + } +} |