Java 如何正确编写截击回调

Java 如何正确编写截击回调,java,android,rest,android-volley,Java,Android,Rest,Android Volley,我正在尝试编写一个截取请求,以获取API的所有用户。我已经成功地做到了这一点,但是,我的功能已经停止工作。如果我现在运行代码并尝试获取所有用户,它只会返回一个空数组。如果我尝试在不停止运行的情况下再次获取它们,它将返回给我所有的用户 这是我的职责: public ArrayList<User> getAllUsers(final VolleyCallBack callBack) { requestQueue = Volley.newRequestQueue(this);

我正在尝试编写一个截取请求,以获取API的所有用户。我已经成功地做到了这一点,但是,我的功能已经停止工作。如果我现在运行代码并尝试获取所有用户,它只会返回一个空数组。如果我尝试在不停止运行的情况下再次获取它们,它将返回给我所有的用户

这是我的职责:

public ArrayList<User> getAllUsers(final VolleyCallBack callBack) {
    requestQueue = Volley.newRequestQueue(this);
    JsonArrayRequest arrayRequest = new JsonArrayRequest(
        Request.Method.GET,
        "http://ecoproduce.eu/api/User",
        null,
        new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                Log.e("Rest response", response.toString());

                Gson gson = new Gson();
                User user = new User();

                for (int i = 0; i < response.length(); i++) {
                    try {
                        user = gson.fromJson(response.getJSONObject(i).toString(), User.class);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    allUsers.add(user);
                }
                callBack.onSuccess();
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Error response", error.toString());
            }
        }
    );
    requestQueue.add(arrayRequest);
    return allUsers;
}
ArrayList<User> currentUsers;

currentUsers = getAllUsers(new VolleyCallBack() {
        @Override
        public ArrayList<User> onSuccess() {
            Log.e("Bla", "ALL DONE!!!");
            return allUsers;
        }
    });
public ArrayList getAllUsers(最终截击回调){
requestQueue=Volley.newRequestQueue(this);
JsonArrayRequest arrayRequest=新JsonArrayRequest(
Request.Method.GET,
"http://ecoproduce.eu/api/User",
无效的
新的Response.Listener(){
@凌驾
公共void onResponse(JSONArray响应){
Log.e(“Rest响应”,response.toString());
Gson Gson=新的Gson();
用户=新用户();
对于(int i=0;i
这是我的回调接口:

public interface VolleyCallBack {
    ArrayList<User> onSuccess();
}
公共接口截击回调{
ArrayList onSuccess();
}
这就是我调用函数的方式:

public ArrayList<User> getAllUsers(final VolleyCallBack callBack) {
    requestQueue = Volley.newRequestQueue(this);
    JsonArrayRequest arrayRequest = new JsonArrayRequest(
        Request.Method.GET,
        "http://ecoproduce.eu/api/User",
        null,
        new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                Log.e("Rest response", response.toString());

                Gson gson = new Gson();
                User user = new User();

                for (int i = 0; i < response.length(); i++) {
                    try {
                        user = gson.fromJson(response.getJSONObject(i).toString(), User.class);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    allUsers.add(user);
                }
                callBack.onSuccess();
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Error response", error.toString());
            }
        }
    );
    requestQueue.add(arrayRequest);
    return allUsers;
}
ArrayList<User> currentUsers;

currentUsers = getAllUsers(new VolleyCallBack() {
        @Override
        public ArrayList<User> onSuccess() {
            Log.e("Bla", "ALL DONE!!!");
            return allUsers;
        }
    });
arraylistcurrentusers;
currentUsers=getAllUsers(新截击回调(){
@凌驾
公共阵列列表onSuccess(){
Log.e(“Bla”,“全部完成!!!”;
回归诱惑;
}
});
我不知道问题是什么,这就像一个小时前一样工作正常,但由于某种原因,它停止了。这是我第一次尝试编写RESTful请求,但我无法确定代码中的错误

解决方案:


通过进行Reaz Murshed建议的更改并将getAllUsers调用移动到onCreate的主体而不是onClick()函数中,问题得以解决。

将get请求放入后台线程后,
getAllUsers
函数立即返回
allUsers
。这就是说,当API的后台线程没有完成获取用户列表时,您正在获取用户列表,因此您第一次获得了一个空列表

但是,在第二次中,您将获得它,因为第一个API请求成功地获取了用户并更新了您的
alluser
列表。因此,实际上您并不是从第二次API请求中获取用户列表,而是从之前发出的请求中获取

要解决此问题,请不要在发送API请求后立即从
getAllUsers
函数返回
allUsers
。等待API请求为您获取数据,您已经有了一个成功回调设置,您应该能够在那里获得所需的用户数据

因此,您需要在
活动
片段
中,或在调用
getAllUsers
方法的任何地方实现
onSuccess
方法,并在收到成功回调时对用户列表执行必要的操作

我建议稍微修改一下回调函数,这样您就可以实际传递从服务器获取的信息

public interface VolleyCallBack {
    void onSuccess(ArrayList<User>);
}

我希望这有帮助

我已经做了你建议的编辑,但我仍然面临同样的问题。你不应该,你确定你正在等待截击获取所有用户,然后在其他地方使用它吗?正如我所说,您应该先等待截击后台线程完成。是否应该使用onSuccess方法自动完成等待?是的,应该。请修改
getAllUsers
函数以返回
void