4

我正在使用 [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。

任何的想法?

4

2 回答 2

2

最后,由于谷歌库缓存请求,我修复了这个用 Retrofit 替换 Volley 的错误,总是在同一个线程(主线程)中返回,并且某些东西似乎被同步请求阻塞。

在这篇文章中做了一个更好的解释:https ://solidgeargroup.com/android-priority-job-queue-background-tasks

于 2016-09-19T09:14:21.887 回答
2

这可能是由于将相同的内容传递DefaultRetryPolicy给多个请求造成的。

VolleymCurrentTimeoutMsDefaultRetryPolicy. 如果有多个请求,mCurrentTimeoutMs则以指数方式递增并可能溢出为负数。

于 2019-03-20T08:19:23.190 回答