Android Volley onResponse 不执行 :(

Android Volley onResponse does not execute :(

我想检查用户是否存在和 return 结果,但是 onResponse() 在 returning isUserExist 之前没有实现,有人可以建议如何修复吗? :)

// Check existence of email address
private boolean verifyEmail(String email) {
    isUserExist = false;

    loginURL = Uri.parse(loginURL).buildUpon()
            .appendQueryParameter("email",email)
            .build().toString();

    GsonRequest<StaffUser> gsonRequest = new GsonRequest<StaffUser>(loginURL, StaffUser.class, null,
            new Response.Listener<StaffUser>() {
                @Override
                public void onResponse(StaffUser response) {
                    if (response != null) {
                        Log.i(TAG, "staffUserId: " + response.getStaffUserId());
                        isUserExist = true;
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // TODO: Handle error
            Log.e(TAG, "VolleyError: " + error);
        }
    }
    );

    // Access the RequestQueue through your singleton class.
    MySingleton.getInstance(this).addToRequestQueue(gsonRequest);

    return isUserExist;
}

您必须使用 listener 进行响应检测 因为 Volly 异步的

https://developer.android.com/training/volley

  • 强大的排序功能可以轻松正确地填充您的 UI 从网络异步获取的数据。

所以你必须使用listener句柄responce 看看怎么做

  public class MyCustomListnerObject {
      // Step 1 - This interface defines the type of messages I want to communicate to my owner  
      public interface MyCustomObjectListener {
          // These methods are the different events and 
          // need to pass relevant arguments related to the event triggered
          public void onObjectReady(String title);
          // or when data has been loaded
          public void onDataLoaded(SomeData data);
      }

    private MyCustomObjectListener listener;

  // Constructor where listener events are ignored
    public MyCustomObject() {
        // set null or default listener or accept as argument to constructor
        this.listener = null; 
    }

    // Assign the listener implementing events interface that will receive the events
    public void setCustomObjectListener(MyCustomObjectListener listener) {
        this.listener = listener;
    }
    }

那么你的 Volly

  // Check existence of email address
    private void verifyEmail(String email) {
        isUserExist = false;

        loginURL = Uri.parse(loginURL).buildUpon()
                .appendQueryParameter("email",email)
                .build().toString();

        GsonRequest<StaffUser> gsonRequest = new GsonRequest<StaffUser>(loginURL, StaffUser.class, null,
                new Response.Listener<StaffUser>() {
                    @Override
                    public void onResponse(StaffUser response) {
                        if (response != null) {
                            Log.i(TAG, "staffUserId: " + response.getStaffUserId());
                         if (listener != null)
                      listener.onDataLoaded(data); // <---- fire listener here
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO: Handle error
listener.onDataLoaded(data); // <---- fire listener here
                Log.e(TAG, "VolleyError: " + error);
            }
        }
        );

        // Access the RequestQueue through your singleton class.
        MySingleton.getInstance(this).addToRequestQueue(gsonRequest);


    }

How to create a proper Volley Listener for cross class Volley method calling

您必须创建接口并将监听器传递给在回调方法中提供验证响应的 verifyEmail 方法。

添加回调接口

public interface VerifyEmailListner {
    void onResponse(boolean success);
}

像这样改变你的方法,设置 void return 类型而不是 boolean

private void verifyEmail(String email,final VerifyEmailListner listner) {
    isUserExist = false;

    loginURL = Uri.parse(loginURL).buildUpon()
            .appendQueryParameter("email",email)
            .build().toString();

    GsonRequest<StaffUser> gsonRequest = new GsonRequest<StaffUser>(loginURL, StaffUser.class, null,
            new Response.Listener<StaffUser>() {
                @Override
                public void onResponse(StaffUser response) {
                    if (response != null) {
                        Log.i(TAG, "staffUserId: " + response.getStaffUserId());
                        listner.onResponse(true);
                        isUserExist = true;
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // TODO: Handle error
            Log.e(TAG, "VolleyError: " + error);
            listner.onResponse(false);
            isUserExist = false;
        }
    }
    );
    // Access the RequestQueue through your singleton class.
    MySingleton.getInstance(this).addToRequestQueue(gsonRequest);
}

像这样调用方法

  verifyEmail("abc@gmail.com",new VerifyEmailListner () {
        public void onResponse(boolean success){
            if(success){
                // verified
            } else{
              // not verified
            }
        }
    });