Volley使用StringRequest和RequestFuture进行阻塞同步调用

时间:2017-10-05 15:15:53

标签: android android-volley

我有以下代码可以调用并接收xml。

StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            // Do something with the response
                            Log.e(TAG, "response from RRSendCarerLocation = " + response);

                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            // Handle error
                            Log.e(TAG, "error: RRSendCarerLocation = " + error);



                        }
                    });


            rq.add(stringRequest);

我遇到的问题是,从Activity调用时这可行,但我想从IntentService使用Volley。工作完成后,intentService会自行销毁,因此Volley回调永远不会撤消响应。

我发现的一个解决方案是使用RequestFuture并调用.get()来阻塞线程。我在这里找到了一个例子。

Can I do a synchronous request with volley?

RequestFuture<JSONObject> future = RequestFuture.newFuture();
JsonObjectRequest request = new JsonObjectRequest(URL, new JSONObject(), future, future);
requestQueue.add(request);

try {
            return future.get(30, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            // exception handling
        } catch (ExecutionException e) {
            // exception handling
        } catch (TimeoutException e) {
            // exception handling
        }

我不想使用JSON,因为服务器返回xml。我查看了StringRequest类,但是我看不到任何支持RequestFuture的内容。

http://griosf.github.io/android-volley/com/android/volley/toolbox/StringRequest.html

无论如何使用StringRequest代码使用RequestFuture的阻止功能返回xml

感谢

2 个答案:

答案 0 :(得分:0)

我对这类请求使用Retrofit。它非常易于使用,允许您进行两种类型的请求(同步和非同步) http://square.github.io/retrofit/

答案 1 :(得分:0)

以防万一您找不到最佳解决方案或任何遇到此问题的人。如果要将StringRequest与FutureRequest一起使用,可以尝试以下解决方案。

with your_data as (
     select stack(1, array(
     '{"id":"123","name":"ABC","age":"18","subject":"Maths","score":20}',
     '{"id":"124","name":"ABCD","age":"20","subject":"History","score":40}',
     '{"id":"213","name":"XYZ","age":"28","subject":"Economics","score":35}')
     ) as json_array
)

select --t.json_array as initial_data,
       --a.json, 
       get_json_object(a.json, '$.id')      id,
       get_json_object(a.json, '$.name')    name,
       get_json_object(a.json, '$.age')     age,
       get_json_object(a.json, '$.subject') subject,
       get_json_object(a.json, '$.score')   score    
  from your_data t 
       lateral view outer explode(json_array) a as json
  where get_json_object(a.json, '$.id') = 123  ;