解析findInBackground没有添加到全局arraylist?

时间:2015-11-24 06:00:39

标签: java android parse-platform

这是我的代码片段,名称中包含少量修改。

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的更改。

4 个答案:

答案 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());
            }
        }
    });
}