VolleyError: java.lang.IllegalArgumentException: timeout < 0
VolleyError: java.lang.IllegalArgumentException: timeout < 0
我正在使用 [Jobqueue] 库,使用 Volley 的同步请求。一切正常,但经过很长时间或在未确定的时间后执行大量请求后,我收到此错误:
Caused by: com.android.volley.VolleyError: java.lang.IllegalArgumentException: timeout < 0
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:141)
Caused by: java.lang.IllegalArgumentException: timeout < 0
at java.net.Socket.setSoTimeout(Socket.java:521)
at com.android.okhttp.internal.http.HttpTransport.discardStream(HttpTransport.java:193)
at com.android.okhttp.internal.http.HttpTransport.makeReusable(HttpTransport.java:170)
at com.android.okhttp.internal.http.HttpEngine.release(HttpEngine.java:445)
at com.android.okhttp.internal.http.AbstractHttpInputStream.endOfInput(AbstractHttpInputStream.java:86)
at com.android.okhttp.internal.http.HttpTransport$FixedLengthInputStream.read(HttpTransport.java:394)
at java.io.InputStream.read(InputStream.java:162)
at com.android.volley.toolbox.BasicNetwork.entityToBytes(BasicNetwork.java:238)
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:123)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)
这个错误很奇怪,因为一旦我得到这个错误,请求就不再工作了。
我已经尝试了很多事情,例如每个作业都有一个 RequestQueue 而不是一个应用程序实例 RequestQueue,取消所有作业并重置 RequestQueue 中的作业和请求。
这是我如何使用 Volley 同步请求的示例:
public class FetchBlacklistJob extends Job {
public static final String TAG = FetchBlacklistJob.class.getCanonicalName();
public FetchBlacklistJob(String groupId) {
super(new Params(Constants.JOB_PRIORITY.HIGH.getValue())
.addTags(TAG)
.setGroupId(groupId)
.singleInstanceBy(TAG)
.requireNetwork());
}
@Override
public void onAdded() {
}
@Override
public void onRun() throws Throwable {
RequestFuture<Blacklist> syncCallback = RequestFuture.newFuture();
GetBlacklistRequest request = new GetBlacklistRequest(currentBlacklist,
syncCallback, syncCallback);
syncCallback.setRequest(VolleyManager.getInstance().addRequest(request));
Blacklist response = syncCallback.get(VolleyManager.TIMEOUT, TimeUnit.MILLISECONDS);
if (response == null || response.getBlacklist() == null) {
Log.d(TAG, "response null, skipping...");
return;
}
DBUtils.saveBlacklist(response);
}
@Override
protected void onCancel(int cancelReason, @Nullable Throwable throwable) {
}
我忘了评论我有一个 15 秒的每个请求超时,并且 volley 中的最大重试次数是 0。
有什么想法吗?
最后,由于 Google 库缓存请求,我修复了这个用 Retrofit 替换 Volley 的错误,总是在同一个线程(主线程)中返回,并且某些东西似乎被同步请求阻塞了。
这个post做了更好的解释:https://solidgeargroup.com/android-priority-job-queue-background-tasks
这可能是由于将相同的 DefaultRetryPolicy
传递给多个请求造成的。
Volley 跟踪 DefaultRetryPolicy
中的尝试次数和当前超时 (mCurrentTimeoutMs
)。如果有多个请求,mCurrentTimeoutMs
呈指数递增,并可能溢出为负数。
我正在使用 [Jobqueue] 库,使用 Volley 的同步请求。一切正常,但经过很长时间或在未确定的时间后执行大量请求后,我收到此错误:
Caused by: com.android.volley.VolleyError: java.lang.IllegalArgumentException: timeout < 0
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:141)
Caused by: java.lang.IllegalArgumentException: timeout < 0
at java.net.Socket.setSoTimeout(Socket.java:521)
at com.android.okhttp.internal.http.HttpTransport.discardStream(HttpTransport.java:193)
at com.android.okhttp.internal.http.HttpTransport.makeReusable(HttpTransport.java:170)
at com.android.okhttp.internal.http.HttpEngine.release(HttpEngine.java:445)
at com.android.okhttp.internal.http.AbstractHttpInputStream.endOfInput(AbstractHttpInputStream.java:86)
at com.android.okhttp.internal.http.HttpTransport$FixedLengthInputStream.read(HttpTransport.java:394)
at java.io.InputStream.read(InputStream.java:162)
at com.android.volley.toolbox.BasicNetwork.entityToBytes(BasicNetwork.java:238)
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:123)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)
这个错误很奇怪,因为一旦我得到这个错误,请求就不再工作了。 我已经尝试了很多事情,例如每个作业都有一个 RequestQueue 而不是一个应用程序实例 RequestQueue,取消所有作业并重置 RequestQueue 中的作业和请求。
这是我如何使用 Volley 同步请求的示例:
public class FetchBlacklistJob extends Job {
public static final String TAG = FetchBlacklistJob.class.getCanonicalName();
public FetchBlacklistJob(String groupId) {
super(new Params(Constants.JOB_PRIORITY.HIGH.getValue())
.addTags(TAG)
.setGroupId(groupId)
.singleInstanceBy(TAG)
.requireNetwork());
}
@Override
public void onAdded() {
}
@Override
public void onRun() throws Throwable {
RequestFuture<Blacklist> syncCallback = RequestFuture.newFuture();
GetBlacklistRequest request = new GetBlacklistRequest(currentBlacklist,
syncCallback, syncCallback);
syncCallback.setRequest(VolleyManager.getInstance().addRequest(request));
Blacklist response = syncCallback.get(VolleyManager.TIMEOUT, TimeUnit.MILLISECONDS);
if (response == null || response.getBlacklist() == null) {
Log.d(TAG, "response null, skipping...");
return;
}
DBUtils.saveBlacklist(response);
}
@Override
protected void onCancel(int cancelReason, @Nullable Throwable throwable) {
}
我忘了评论我有一个 15 秒的每个请求超时,并且 volley 中的最大重试次数是 0。
有什么想法吗?
最后,由于 Google 库缓存请求,我修复了这个用 Retrofit 替换 Volley 的错误,总是在同一个线程(主线程)中返回,并且某些东西似乎被同步请求阻塞了。
这个post做了更好的解释:https://solidgeargroup.com/android-priority-job-queue-background-tasks
这可能是由于将相同的 DefaultRetryPolicy
传递给多个请求造成的。
Volley 跟踪 DefaultRetryPolicy
中的尝试次数和当前超时 (mCurrentTimeoutMs
)。如果有多个请求,mCurrentTimeoutMs
呈指数递增,并可能溢出为负数。