[英]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.