等待截击响应,然后从函数返回值

时间:2019-01-24 08:00:11

标签: android android-volley delay

我正在使用排球库来获取服务器的响应
我希望当来自凌空的响应接收到然后函数返回存在的boolean值时,我已经尝试了栈上几乎所有的方法,例如wait / notify和其他方法,但是它们停止了整个执行,而凌空响应在此之后没有收到

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 :(得分:2)

排球在不同的线程上运行

由于Volley Request在不同的线程上运行,您需要知道Volley请求何时完成。只有这样,您才应该调用该方法。 为此,您可以创建一个接口,该接口将在方法完成时通知。

public interface VolleyListener{

    public void requestFinished(boolean exsitance);

}

在“活动”中实施此方法会覆盖界面方法

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中调用接口方法?

  • 键入排球侦听器
  • 致电volleyListener.requestFinished(true);volleyListener.requestFinished(false);根据来自 排球。
    这是示例代码段

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