在方法中我的列表有元素,但是当我出来时列表是空的

In method my List has elements, but when I get out the list is empty

我正在使用 Back4App,它基本上是旧 parse.com 以前的样子。我有这段代码,其中 done 方法我的 public List 有 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;

第一条日志语句returns:[Littleton, 5, 4, 3, 1, 2]

第二条日志语句returns:[]

我在 class 之前创建了列表,因此它不仅仅是 done 方法的本地列表。

public static List<String> settingsArray = new ArrayList<String>();

once I get out of my method the list is empty.

就是这样,您没有 "get out" 该方法 - 尚未输入。

基本上,如果您尝试 return 您正在等待的数据,您不应该 return 来自异步方法。

如果您想正确 return 该列表,

  1. 通过new FindCallback<settings>()作为该方法的参数,并将其传递给findInBackground

  2. 定义你自己的回调接口,它可以从done方法中发回数据。

在这两种情况下,您都可以制作方法void


例如,选项 1。(我将其设为静态,因为似乎不需要包含该方法的 class 的任何实例)

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

就是这样。

您可以在任何地方这样称呼它,显然用您的实际 class 名称替换 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);
            }
        }
    });
}