Android - 排球:回应太晚了

时间:2017-05-04 08:16:56

标签: android android-volley

所以我在我的代码中遇到了一个问题,我需要从我的服务器中获取一个带有齐射的JSONString。然后我必须将String解析为JSONObject,然后继续使用它。

我的问题是,Volley给出的响应太迟了,这意味着我要解析的字符串总是空的,因为它尚未初始化。

RequestFuture<String> future = RequestFuture.newFuture();
StringRequest stringRequest = new StringRequest(Request.Method.GET, searchURLBuilder, future, future);
//        new Response.Listener<String>() {
//            @Override
//            public void onResponse(String response) {
//                writeToSharedResponse(response_for_search, response);
//            }
//        },
//        new Response.ErrorListener() {
//            @Override
//            public void onErrorResponse(VolleyError error) {
//                 Log.d("Error!!:" + error.getMessage(), "");
//            }
//        });
requestQueue.add(stringRequest);
String response = "";
try {
    response = future.get(60, TimeUnit.SECONDS);
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
} catch (TimeoutException e) {
    e.printStackTrace();
}

String responseString = m.getString(response_for_search, new String());

pieceDTOList = getPiecesDTOFromJSON(responseString);

以下是我的代码片段。正如你所看到的,我已经尝试过制作未来的#34;呼叫阻止并等待答案,但每次都只是超时。注释掉的位是我从一开始就想要使用的部分,但是它会在晚期返回响应。由于它是异步的,因此无需访问服务器。

writeToSharedResponse只是将答案写入sharedPreferences变量。

private SharedPreferences m;
private SharedPreferences.Editor editor;

private RequestQueue requestQueue;

public DbParser(Context c) {
    m = PreferenceManager.getDefaultSharedPreferences(c);
    editor = m.edit();
    requestQueue = Volley.newRequestQueue(c);
}

我的问题是:我能否有一个简单的方法等待&#34;对于排球的答案,我可以继续处理我得到的回应吗?

编辑1:

我现在添加了一个界面并将代码更改为:

    getString(new VolleyCallback() {
        @Override
        public void onSuccess(String result) {
            getPiecesDTOFromJSON(result);
        }
    }, searchURLBuilder);


    return globalPieceDTOList;

}

private void getString(final VolleyCallback callback, String searchUrl){
    StringRequest stringRequest = new StringRequest(Request.Method.GET, searchUrl,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    callback.onSuccess(response);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("Error!!:" + error.getMessage(), "");
                }
            });
    requestQueue.add(stringRequest);
}

由于我无法从内部类中获取值,因此我做了一个讨厌的黑客并为我的DTO创建了一个全局列表。现在的问题是&#34;返回globalPieceDTOList&#34;永远是空的。再一次 - 我需要等待&#34;对于排球的反应。

1 个答案:

答案 0 :(得分:0)

Volley请求是异步的,因此当您尝试返回值时,请求可能尚未完成。如果要从Volley请求返回值,请使用回调接口。

实施例

public void getString(final VolleyCallback callback) {
    StringRequest strReq = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            // do some things here
            callback.onSuccess(<PASS STRING RESULT HERE>);
        }
    });
}

public interface VolleyCallback{
    void onSuccess(String result);
}

使用示例:

public void onResume(){
    super.onResume();
    getString(new VolleyCallback(){
         @Override
         public void onSuccess(String result){
             //do stuff here with the result from the volley request
         }
    });
}