Android 如何让StringRequestVolley等待响应?

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

我是Android新手,我希望你能帮我解决StringRequestVolley问题。在我的项目中,我将调用几个API。为此,我创建了一个名为ProcessAPIRequest的方法。为此,我将传递URL作为参数。这是我的函数代码片段

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
    }

}