我正在使用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)
这个bug非常奇怪,因为一旦我得到这个错误,请求就不再工作了。我尝试过很多事情,比如每个作业都有一个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秒和最大重试次数在截击是0。
有什么想法吗?
发布于 2016-09-19 01:14:21
最后,我修正了这个错误,因为Google库缓存请求,所以用Retrofit代替Volley,总是在同一个线程(主线程)中返回,并且某些东西似乎被同步请求阻塞了。
在这篇文章中有一个更好的解释:https://solidgeargroup.com/android-priority-job-queue-background-tasks
发布于 2019-03-20 00:19:23
这可能是通过将相同的DefaultRetryPolicy
传递给多个请求造成的。
Volley跟踪DefaultRetryPolicy
中的尝试次数和当前超时( current timeout,DefaultRetryPolicy
)。如果有多个请求,mCurrentTimeoutMs
将呈指数递增,并会溢出为负。
https://stackoverflow.com/questions/37743206
复制相似问题