Как заставить StringRequestVolley ждать ответа? - PullRequest
0 голосов
/ 27 августа 2018

Я новичок в 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;
}

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я вызываю этот метод, я получаю пустой ответ. Метод public void onResponse запускается после возврата ответа. Я хочу, чтобы ответ был возвращен после получения результата.

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Проблема заключается в том, что запросы VolleyRequest выполняются в асинхронных потоках. Правильный способ реализовать это - иметь обратный вызов после получения ответа.

создать интерфейс

 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);

}

Ваш класс: -

 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
    }

}
0 голосов
/ 08 сентября 2018

необходимо добавить метод запроса GET или POST

StringRequest stringRequest = new StringRequest(Request.Method.GET,pURL,
    new Response.Listener<String>() {
0 голосов
/ 27 августа 2018

Для этого вы будете использовать интерфейс обратного вызова. Вот пример.

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);
}
...