为什么Retrofit会在第二次之后给出正确的结果?

时间:2015-11-11 09:55:30

标签: android retrofit

我目前正在为我的Android应用程序使用Retrofit 1.9.0。我开发了一个REST服务。为了从REST获取数据,我实现了以下代码。我想根据服务器端的ID字符串获取人员列表。

if(!ids.isEmpty()) {
     retrofitService.getNewStaffInfo(ids, new Callback<List<StaffInfo>>() {
                 @Override
                 public void success(List<StaffInfo> staffInfos, Response response) {
                    System.out.println(staffInfos.size());
                    for (StaffInfo staff : staffInfos)
                        mStaffInfo.add(staff);
                    // update the local database
                }
                @Override
                public void failure(RetrofitError error) {
                    System.out.println("error");
                }
            }
     );
}
System.out.println(mStaffInfo.size());

然而,我的问题是,我得到了两次结果。第一次,结果列表的大小为零,但第二次,我得到的结果不正确。

如果有人有解决方案,我会很感激,为什么第一次列表结果的大小为零?

1 个答案:

答案 0 :(得分:0)

使用回调时,回调中的代码在网络请求完成之前不会运行。同时,您的程序继续运行代码。在您的情况下,您启动呼叫,在完成之前尝试打印列表的大小。然后,当调用完成时,再次打印列表的大小。我在下面注释了问题。删除它只会打印一次正确的大小。

if(!ids.isEmpty()) {
     retrofitService.getNewStaffInfo(ids, new Callback<List<StaffInfo>>() {
                 @Override
                 public void success(List<StaffInfo> staffInfos, Response response) {
                    System.out.println(staffInfos.size());
                    for (StaffInfo staff : staffInfos)
                        mStaffInfo.add(staff);
                    // update the local database
                }
                @Override
                public void failure(RetrofitError error) {
                    System.out.println("error");
                }
            }
     );
}
System.out.println(mStaffInfo.size());  <---- *** This line runs before the call back and prints out the zero size.  Remove it.