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