【问题标题】:Parse findInBackground doesn't add to global arraylist?解析 findInBackground 不添加到全局数组列表?
【发布时间】:2015-11-24 06:00:38
【问题描述】:

这是我的代码的 sn-p,名称稍作修改。

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 所做的更改在它返回后保持不变。

【问题讨论】:

  • done方法里面?
  • done() 在 query() 中,很抱歉造成混淆

标签: java android parse-platform


【解决方案1】:
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;
}

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

将您的方法公开以在其他类中使用。

【讨论】:

    【解决方案2】:

    在 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"));
        }
    });
    

    【讨论】:

      【解决方案3】:

      如下所示:

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

      表示findInBackground 方法在调用query.findInBackground 方法的不同线程上运行。

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

      这里:

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

      如果我们在if-block 中检查tempListItems 的大小,则大小始终为zero,因为如果块在启动query.findInBackground 线程后立即执行,而无需等待任务结果。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2019-11-26
          • 2020-12-26
          • 2018-10-12
          • 1970-01-01
          • 2018-03-20
          • 2014-03-25
          • 2018-05-02
          • 2013-03-01
          • 2023-04-02
          相关资源
          最近更新 更多