我使用的是Back4App,它基本上就是旧的parse.com。我有这段代码,其中我的公共列表的完成方法有5个元素,就像它应该有的那样。然后,一旦我离开我的方法,列表就是空的。
ParseQuery<settings> query = ParseQuery.getQuery(settings.class);
query.whereEqualTo("Username", MainActivity.Display_Name);
query.orderByDescending("createdAt").setLimit(1);
query.findInBackground(new FindCallback<settings>() {
public void done(List<settings> settingsList, ParseException exception) {
for (settings i : settingsList) {
if (exception == null) {
creationDate = i.getCreatedAt();
settingsFrameNumber = i.getFramesPerHive();
settingsArray.add(0, String.valueOf(settingsFrameNumber));
settingsHiveNumber = i.getHiveNumber();
settingsArray.add(0, String.valueOf(settingsHiveNumber));
settingsHiveBodyNumber = i.getHiveBodies();
settingsArray.add(0, String.valueOf(settingsHiveBodyNumber));
settingsSuperNumber = i.getSupers();
settingsArray.add(0, String.valueOf(settingsSuperNumber));
settingsYearsOfBeekeeping = i.getYearsofBeekeeping();
settingsArray.add(0, String.valueOf(settingsYearsOfBeekeeping));
settingsLocation = i.getLocation();
settingsArray.add(0, settingsLocation);
Log.e("Pay Attention", settingsArray.toString());
}
}
}
});
Log.e("Pay Attention", settingsArray.toString());
return settingsArray;
First Log语句返回:[Littleton, 5, 4, 3, 1, 2]
第二个Log语句返回:[]
我在类的前面创建了列表,因此它不仅仅是done方法的本地。
public static List<String> settingsArray = new ArrayList<String>();
答案 0 :(得分:1)
一旦我离开我的方法,列表就是空的。
这就是问题,你没有“退出”那种方法 - 它还没有被输入。
基本上,如果您尝试返回正在等待的数据,则不应从异步方法返回。
如果要正确返回该列表,请
将new FindCallback<settings>()
作为参数传递给该方法,然后将其提交给findInBackground
定义您自己的回调接口,该接口可以从done
方法中发回数据。
在这两种情况下,您都可以制作方法void
。
例如,选项1.(我将其设置为静态,因为似乎不需要包含该方法的类的任何实例)
public static void doStuff(String displayName, FindCallback<settings> callback)
ParseQuery<settings> query = ParseQuery.getQuery(settings.class);
query.whereEqualTo("Username", displayName);
query.orderByDescending("createdAt").setLimit(1);
query.findInBackground(callback);
}
就是这样。
你可以在任何地方调用它,显然用你的实际类名替换ApiService
。
private List<settings> settings;
private void setupList(List<settings> settings) {
Log.d("SETTINGS", String.valueOf(settings)); // Shouldn't be empty
this.settings = settings;
/* Use the list however you want to... */
// adapter = new ArrayAdapter(MainActivity.this, settings);
// listView.setAdapter(adapter);
}
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.some_example);
ApiService.doStuff(MainActivity.Display_Name, new FindCallback<settings>() {
public void done(List<settings> settingsList, ParseException exception) {
if (exception == null) {
...
// Update the UI here
setupList(settingList);
}
}
});
}