Android 如何让StringRequestVolley等待响应?
我是Android新手,我希望你能帮我解决StringRequestVolley问题。在我的项目中,我将调用几个API。为此,我创建了一个名为ProcessAPIRequest的方法。为此,我将传递URL作为参数。这是我的函数代码片段Android 如何让StringRequestVolley等待响应?,android,android-volley,Android,Android Volley,我是Android新手,我希望你能帮我解决StringRequestVolley问题。在我的项目中,我将调用几个API。为此,我创建了一个名为ProcessAPIRequest的方法。为此,我将传递URL作为参数。这是我的函数代码片段 private static String iResponse=""; public static String ProcessAPIRequest(String pURL, Context pContext){ iResponse=""; StringRequ
private static String iResponse="";
public static String ProcessAPIRequest(String pURL, Context pContext){
iResponse="";
StringRequest stringRequest = new StringRequest(pURL,
new Response.Listener<String>() {
@Override
public void onResponse(String strResponse) {
iResponse=strResponse;
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//error.networkResponse;
//Log.e("error", "" + error);
}
});
RequestQueue requestQueue = Volley.newRequestQueue(pContext);
requestQueue.add(stringRequest);
return iResponse;
}
私有静态字符串iResponse=“”;
公共静态字符串ProcessAPRequest(字符串pURL、上下文pContext){
i响应=”;
StringRequest StringRequest=新StringRequest(pURL,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串strResponse){
i响应=strResponse;
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//错误。网络响应;
//Log.e(“错误”,“错误+错误”);
}
});
RequestQueue RequestQueue=Volley.newRequestQueue(pContext);
添加(stringRequest);
回复我的回复;
}
我面临的问题是,每当我调用此方法时,我都会得到空响应。公共void onResponse方法在返回响应后激发。我希望响应在得到结果后立即返回。您将为此使用回调接口。这里有一个例子
public interface OnResponse{
void onResponse(String response);
}
public static void ProcessAPIRequest(String pURL, Context pContext, final OnResponse onResponse){
StringRequest stringRequest = new StringRequest(pURL,
new Response.Listener<String>() {
@Override
public void onResponse(String strResponse) {
onResponse.onResponse(strResponse); // callback for success
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//error.networkResponse;
//Log.e("error", "" + error);
onResponse.onResponse(null); // callback for error
}
});
RequestQueue requestQueue = Volley.newRequestQueue(pContext);
requestQueue.add(stringRequest);
}
公共接口OnResponse{
void onResponse(字符串响应);
}
公共静态void processapirect(字符串pURL、上下文pContext、final OnResponse OnResponse){
StringRequest StringRequest=新StringRequest(pURL,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串strResponse){
onResponse.onResponse(strResponse);//成功回调
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//错误。网络响应;
//Log.e(“错误”,“错误+错误”);
onResponse.onResponse(null);//错误回调
}
});
RequestQueue RequestQueue=Volley.newRequestQueue(pContext);
添加(stringRequest);
}
问题在于截击请求在异步线程上运行,正确的实现方法是在收到响应后进行回调
创建一个接口
public interface VolleyResultCallBack {
void onVolleyResultListener(String response, String requestUrl);
void onVolleyErrorListener(VolleyError error,String requestUrl);
}
你的方法呢
public static void ProcessAPIRequest(VolleyResultCallBack resultListener,String pURL, Context pContext){
iResponse="";
StringRequest stringRequest = new StringRequest(pURL,
new Response.Listener<String>() {
@Override
public void onResponse(String strResponse) {
resultListener.onVolleyResultListener(strResponse,pURL);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//error.networkResponse;
//Log.e("error", "" + error);
resultListener.onVolleyErrorListener(error,pURL);
}
});
RequestQueue requestQueue = Volley.newRequestQueue(pContext);
requestQueue.add(stringRequest);
}
onResponse(stringstrresponse)
将void
作为返回类型,因此您不能编写return
语句。另一种方法是尝试调用另一种方法,如manage\u response(result)
。将值传递给方法并管理结果。请使用改型。或者您可以同步执行请求,尽管方法不正确()onResponse
需要声明processapirest
的final
参数才能起作用。否则,这正是应该如何处理的。OP不能让方法等待——这就是异步调用的全部意义@TedHopp OP的意思是输出?意思是“原创海报”(问题的作者)。谢谢@Redman。你的代码解决了我一半的问题。现在的主要问题是,我将根据前面的API结果调用许多其他API。在onVolleyResultListener方法中,我可能不知道当前有哪个响应。希望你能理解我的问题。通过使用requestUrl,你会知道的
public class TestActivity extends AppCompatActivity implements VolleyResultCallBack {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ClassName.ProcessAPIRequest(this,"Your URl",this)
}
@Override
public void onVolleyResultListener(String response, String requestUrl) {
if(requestUrl.equals("Your URl"){
//do some thing with response
}
}
@Override
public void onVolleyErrorListener(VolleyError error,String requestUrl) {
// error occured get error and show it
}
}