如何正确编写 volley 回调

How to properly write a volley callback

我正在尝试编写一个 volley get 请求来获取我 API 的所有用户。我已成功完成此操作,但是,我的功能已停止工作。如果我现在 运行 我的代码并尝试获取所有用户,它只会 return 一个空数组。如果我尝试在不停止 运行 的情况下再次获取它们,它将 return 给我所有的用户。

这是我的功能:

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

这是我的回调接口:

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

我是这样调用函数的:

ArrayList<User> currentUsers;

currentUsers = getAllUsers(new VolleyCallBack() {
        @Override
        public ArrayList<User> onSuccess() {
            Log.e("Bla", "ALL DONE!!!");
            return allUsers;
        }
    });

我不知道问题出在哪里,它在一个小时前运行得很好,但由于某种原因,它已经停止了。这是我第一次尝试编写 RESTful 请求,我无法真正查明我的代码的错误。

解决方案:

通过进行 Reaz Murshed 建议的更改并将 getAllUsers 调用移动到 onCreate 的正文而不是在 onClick() 函数中来解决问题。

getAllUsers 函数在后台线程中发出获取请求后立即 returning allUsers。也就是说,当您的 API 的后台线程未完成获取您的用户列表时,您将获得用户列表,因此您第一次获得一个空列表。

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

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

因此,您需要在 ActivityFragment 或任何调用 getAllUsers 方法的地方实施 onSuccess 方法,并使用收到成功回调的用户列表。

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

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

并在Volley回调的onResponse函数中,将获取到的用户列表传递如下。

callBack.onSuccess(allUsers);

希望对您有所帮助!