所以我在我的代码中遇到了一个问题,我需要从我的服务器中获取一个带有齐射的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;对于排球的反应。
答案 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
}
});
}