在方法中我的List有元素,但是当我离开时列表是空的

时间:2016-12-12 14:41:41

标签: android parse-platform

我使用的是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>();

1 个答案:

答案 0 :(得分:1)

  

一旦我离开我的方法,列表就是空的。

这就是问题,你没有“退出”那种方法 - 它还没有被输入。

基本上,如果您尝试返回正在等待的数据,则不应从异步方法返回。

如果要正确返回该列表,请

  1. new FindCallback<settings>()作为参数传递给该方法,然后将其提交给findInBackground

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

  3. 在这两种情况下,您都可以制作方法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);
                }
            }
        });
    }