繁体   English   中英

解析findInBackground不会添加到全局arraylist吗?

[英]Parse findInBackground doesn't add to global arraylist?

这是我的代码片段,其中对名称进行了少量编辑。

String[] items;
ArrayList<String>tempListItems;

public void initList() {
        if(query()){
            items = new String[tempListItems.size()];
            items = tempListItems.toArray(items);
            Arrays.sort(items);

            Log.d("HSearch - initList", "Generate Clean List");
            Log.d("initList - temp size", Integer.toString(tempListItems.size()));
            Log.d("initList - items size", Integer.toString(items.length));
        }
    }

private boolean query() {
        tempListItems = new ArrayList<String>();
        ParseQuery<ParseObject> query = ParseQuery.getQuery("Table");
        query.orderByAscending("name");
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> list, com.parse.ParseException e) {
                if (e == null) {
                    for (ParseObject name : list) {
                        tempListItems.add(name.getString("name"));
                    }
                } else {
                    Log.d("score", "Error: " + e.getMessage());
                }
            }
        });
        return true;
    }

我的问题是在query()中,如果我在done()之后检查tempListItems的大小,则该大小不为空。 但是,一旦完成了query()并返回到initList(),如果再次检查tempListItems,则为空。

done()是query()中的一种方法。 我忘记了它的技术术语!

我不确定如何确保在query()期间对tempListItems的更改,并且done()在返回后仍保留。

String[] items;
final ArrayList<String>tempListItems;
{
    tempListItems= new ArrayList<>();
}

public void initList() {
    if(query()){
        items = new String[tempListItems.size()];
        items = tempListItems.toArray(items);
        Arrays.sort(items);

        Log.d("HSearch - initList", "Generate Clean List");
        Log.d("initList - temp size", Integer.toString(tempListItems.size()));
        Log.d("initList - items size", Integer.toString(items.length));
    }
}

private boolean query() {
    ParseQuery<ParseObject> query = ParseQuery.getQuery("Table");
    query.orderByAscending("name");
    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> list, com.parse.ParseException e) {
            if (e == null) {
                for (ParseObject name : list) {
                    tempListItems.add(name.getString("name"));
                }
            } else {
                Log.d("score", "Error: " + e.getMessage());
            }
        }
    });
    return true;
}

更改了您的代码,这应该可以正常工作,因为它对我有用。

公开您的方法以供其他类使用。

如何在query.findInBackground之前创建Handler:

Handler handler = new Handler();

并将for循环放入handler.post(Runnable)内:

handler.post(new Runnable(){
    @Override
    run(){
       for (ParseObject name : list)
           tempListItems.add(name.getString("name"));
    }
});

如此处所示:

findInBackground在后台线程中从源中检索满足此查询的 ParseObject 列表。

意味着findInBackground方法正在不同的线程上运行,从该线程调用query.findInBackground方法。

如果我在done()之后检查tempListItems的大小,则该大小不为空

这里:

if(query()){
   //....
  }

如果我们在if-block内检查tempListItems大小,则大小始终zero因为如果块在开始query.findInBackground线程后query.findInBackground执行,而无需等待Task的结果。

done是一个回调方法,当findInBackground在启动该线程的同一线程上完成执行时将调用该方法。

query()将返回true而无需等待done响应。 这就是list为空的原因。

使您的代码成功done

  private void query() {
    ParseQuery<ParseObject> query = ParseQuery.getQuery("Table");
    query.orderByAscending("name");
    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> list, com.parse.ParseException e) {
            if (e == null) {
                for (ParseObject name : list) {
                    tempListItems.add(name.getString("name"));
                }

                items = new String[tempListItems.size()];
                items = tempListItems.toArray(items);
                Arrays.sort(items);

                Log.d("HSearch - initList", "Generate Clean List");
                Log.d("initList - temp size",
                        Integer.toString(tempListItems.size()));
                Log.d("initList - items size",
                        Integer.toString(items.length));
            } else {
                Log.d("score", "Error: " + e.getMessage());
            }
        }
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM