ждать ответа залпа и затем возвращать значение из функции - PullRequest
0 голосов
/ 24 января 2019

Я использую библиотеку залпов для получения ответа от сервера
Я хочу, чтобы, когда ответ от залпа получал, а затем функция возвращала значение существования boolean, я перепробовал почти все методы переполнения стека, такие как ожидание / уведомление и другие.но они останавливают всю казнь, и после этого залповый ответ не получает

boolean exsitance= false;

public  boolean checkUserExist(final String id, final String email)
{

  try {
      RequestQueue requestQueue = Volley.newRequestQueue(context);
      JSONObject jsonBody = new JSONObject();
      if (id != null)
        jsonBody.put("id", id);
      if (email != null)
        jsonBody.put("email", email);
      final String mRequestBody = jsonBody.toString();

      StringRequest stringRequest = new StringRequest(Request.Method.POST, UrlConstants.checkUserExsist, new Response.Listener<String>() {
         @Override
         public void onResponse(String response) {
             Log.i("LOG_RESPONSE", response);
             exsitance = true;

            Toast.makeText(context, "user  exsist", Toast.LENGTH_SHORT).show();
        }
     }, new Response.ErrorListener() {
         @Override
         public void onErrorResponse(VolleyError error) {

            try {
                if (error.networkResponse.statusCode == 400) {
                    Toast.makeText(context, "user not exsist" + error.networkResponse.statusCode, Toast.LENGTH_SHORT).show();

                    exsitance = false;

                }
            } catch (Exception e) {

            }
        }
      }) {
         @Override
         public String getBodyContentType() {
            return "application/json; charset=utf-8";
         }

         @Override
         public byte[] getBody() throws AuthFailureError {
             try {
                return mRequestBody == null ? null : mRequestBody.getBytes("utf-8");
            } catch (UnsupportedEncodingException uee) {
                VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", mRequestBody, "utf-8");
                return null;
             }
         }

        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse response) {
            String responseString = "";
            if (response != null) {
                responseString = String.valueOf(response.statusCode);
                Log.d("statuscode_volley", responseString);

            }
            return Response.success(responseString, HttpHeaderParser.parseCacheHeaders(response));
        }
    };

    requestQueue.add(stringRequest);
} catch (JSONException e) {
    e.printStackTrace();
}

    return exsitance;
}

Пожалуйста, помогите мне.Заранее спасибо

1 Ответ

0 голосов
/ 24 января 2019

залп работает в другой теме

Поскольку запрос залпа выполняется в другом потоке, вам нужно знать, когда запрос залпа будет выполнен. Только тогда вы должны вызвать метод. Для этого вы можете создать интерфейс, который будет уведомлять, когда метод будет завершен.

public interface VolleyListener{

    public void requestFinished(boolean exsitance);

}

Реализация этого метода в Activity переопределяет метод интерфейса

YourActivity implements VolleyListener{   

  @Override
  public void onCreate(Bundle savedInstanceState)
  {
         ----- Activity code
  }

  ----------
  @Override
  public void requestFinished(boolean exsitance)
  {
     // Do whatever you want to do
  }

}

Как вызвать метод интерфейса из Volley Request?

  • Typecast Volleylistener
  • Звоните volleyListener.requestFinished(true); или volleyListener.requestFinished(false); на основании ответа от Volley.
    Вот пример кода

    public  boolean checkUserExist(final String id, final String email)
    {
       ------------------
    
       VolleyListener volleyListener = (VolleyListener)context;
    
       @Override
       public void onResponse(String response) {
        volleyListener.requestFinished(true);
       }
       }, new Response.ErrorListener() {
       @Override
       public void onErrorResponse(VolleyError error) {
    
        volleyListener.requestFinished(false);
    
       -------------------
    }
    
...