可以用volley完成同步请求吗?

我可以用volley完成同步请求吗?

假设我在一个已经有后台线程的服务中。我是否可以在同一个线程中使用volley执行请求,以便回调同步进行?

这有两个原因:-首先,我不需要另一个线程,创建它将是一种浪费。-第二,如果我在ServiceIntent中,线程的执行将在回调之前完成,因此,我将不会得到volley的响应。我知道我可以创建我自己的服务,它有一个我可以控制的运行循环线程,但是在volley中使用这个功能是可取的。

谢谢!


海绵宝宝撒
浏览 503回答 3
3回答

RISEBY

看上去这是有可能的RequestFuture班级,等级。例如,要创建同步的JSONHTTPGET请求,可以执行以下操作:RequestFuture<JSONObject>&nbsp;future&nbsp;=&nbsp;RequestFuture.newFuture();JsonObjectRequest&nbsp;request&nbsp;=&nbsp;new&nbsp;JsonObjectRequest(URL,&nbsp;new&nbsp;JSONObject(),&nbsp; future,&nbsp;future);requestQueue.add(request);try&nbsp;{ &nbsp;&nbsp;JSONObject&nbsp;response&nbsp;=&nbsp;future.get();&nbsp;//&nbsp;this&nbsp;will&nbsp;block}&nbsp;catch&nbsp;(InterruptedException&nbsp;e)&nbsp;{ &nbsp;&nbsp;//&nbsp;exception&nbsp;handling}&nbsp;catch&nbsp;(ExecutionException&nbsp;e)&nbsp;{ &nbsp;&nbsp;//&nbsp;exception&nbsp;handling}

翻翻过去那场雪

如果你在另一个线程上,当你没有互联网的时候,你会打一个截击电话,您的错误回调将在主线程上调用,但您所在的线程将永远被阻塞。(因此,如果该线程是IntentService,您将永远无法向它发送另一条消息,并且您的服务将基本上死掉)。使用get()有一个超时future.get(30, TimeUnit.SECONDS)并捕捉错误以退出线程。匹配@mathews回答:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;future.get(30,&nbsp;TimeUnit.SECONDS); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(InterruptedException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;exception&nbsp;handling &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(ExecutionException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;exception&nbsp;handling &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(TimeoutException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;exception&nbsp;handling &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}下面我用一个方法包装它&使用一个不同的请求:&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Runs&nbsp;a&nbsp;blocking&nbsp;Volley&nbsp;request &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;method&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get/put/post&nbsp;etc &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;url&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endpoint &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;errorListener&nbsp;handles&nbsp;errors &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;the&nbsp;input&nbsp;stream&nbsp;result&nbsp;or&nbsp;exception:&nbsp;NOTE&nbsp;returns&nbsp;null&nbsp;once&nbsp;the&nbsp;onErrorResponse&nbsp;listener&nbsp;has&nbsp;been&nbsp;called &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;InputStream&nbsp;runInputStreamRequest(int&nbsp;method,&nbsp;String&nbsp;url,&nbsp;Response.ErrorListener&nbsp;errorListener)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestFuture<InputStream>&nbsp;future&nbsp;=&nbsp;RequestFuture.newFuture(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStreamRequest&nbsp;request&nbsp;=&nbsp;new&nbsp;InputStreamRequest(method,&nbsp;url,&nbsp;future,&nbsp;errorListener); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getQueue().add(request); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;future.get(REQUEST_TIMEOUT,&nbsp;TimeUnit.SECONDS); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(InterruptedException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.e("Retrieve&nbsp;cards&nbsp;api&nbsp;call&nbsp;interrupted.",&nbsp;e); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorListener.onErrorResponse(new&nbsp;VolleyError(e)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(ExecutionException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.e("Retrieve&nbsp;cards&nbsp;api&nbsp;call&nbsp;failed.",&nbsp;e); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorListener.onErrorResponse(new&nbsp;VolleyError(e)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(TimeoutException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.e("Retrieve&nbsp;cards&nbsp;api&nbsp;call&nbsp;timed&nbsp;out.",&nbsp;e); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorListener.onErrorResponse(new&nbsp;VolleyError(e)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java