2015-11-24 35 views
1

这是我的代码的一个片段,在名称中进行小编辑。解析findInBackground不会添加到全局数组列表?

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

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

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

我不确定如何确保在query()和done()函数返回后,对tempListItems所做的更改。

+0

和内部完成的方法? –

+0

done()在query()内部,对于混淆抱歉 – Tony

回答

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

正如在这里看到:

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

意思findInBackground方法运行在不同的线程从中调用query.findInBackground方法。

如果我检查后tempListItems的大小()完成规模并不 空

这里:

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

如果我们检查的tempListItems尺寸内if-block那么大小总是zero因为如果块刚开始执行query.findInBackground线程无需等待任务结果。

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

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

如何query.findInBackground之前创建一个处理程序:

Handler handler = new Handler(); 

,并把对循环内handler.post(Runnable接口) :

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