这是我的代码片段,名称中包含少量修改。
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()和done()返回后保留对tempListItems的更改。
答案 0 :(得分:3)
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;
}
更改了您的代码,这应该可行,因为它对我有用。
将您的方法公开以用于其他类。
答案 1 :(得分:2)
如何在query.findInBackground之前创建一个处理程序:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<form id="test_form">
<div id="test1">
<button id="button">Upload
<input type="file" id="test">
</button>
</div>
</form>
并将for循环放在handler.post(Runnable)中:
SELECT post_id, category, author_id, title, article, time
FROM blog_post t
WHERE
t.post_id=(SELECT TOP 1 post_id
FROM Table t2
WHERE
t.post_id=t2.post_id
ORDER BY time DESC)
答案 2 :(得分:1)
如下所示:
findInBackground:从后台线程中的源中检索满足此查询的ParseObjects列表。
意味着findInBackground
方法正在调用query.findInBackground
方法的不同线程上运行。
如果我在done()之后检查tempListItems的大小,则不是 空
下面:
if(query()){
//....
}
如果我们在tempListItems
内检查if-block
的大小,那么大小始终为zero
,因为如果在刚启动query.findInBackground
线程之后就执行了块,而不等待任务结果。
done
是一个回调方法,当findInBackground
在启动它的同一个线程上执行完成时调用该方法。
答案 3 :(得分:1)
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());
}
}
});
}