0

我正在做两个 Parse.com 查询..

ABC.findInBackground(new FindCallback<ParseObject>()
 {
 ...
 }
DEF.findInBackground(new FindCallback<ParseObject>()
 {
 ...
 }

我基本上尝试过这样做,

CountDownLatch waitForBoth = new CountDownLatch(2);

ABC.findInBackground(new FindCallback<ParseObject>()
 {
 ...
 waitForBoth.countDown();
 }
DEF.findInBackground(new FindCallback<ParseObject>()
 {
 ...
 waitForBoth.countDown();
 }
 // (error handling (just a flag) not shown)

waitForBoth.await();
Log("both are finished yay!");

当然,我只是得到各种各样的错误IllegalMonitorStateException: object not locked by thread before wait() etc 等等。

除了我很密集之外,问题的一部分是,实际上那些对 Parse 的 findInBackground 的调用,无论如何都会让你离开一个新线程,对吧?

作为记录,其中一个 Parse 调用看起来像这样,

ParseQuery<ParseObject>PQ = ParseQuery.getQuery("SomeTable");

PQ.whereEqualTo("SomeColumn", ParseUser.getCurrentUser());
PQ.include("SomeOtherColumn");

PQ.findInBackground(new FindCallback<ParseObject>()
{
@Override
public void done(List<ParseObject> res, ParseException e)
  {
  if (e == null)
    {
    // res is the List of ParseObject results from the cloud
    // here, you'd basically...
    waitForBoth.countDown();
    }
  else
    {
    int errCodeSimple = e.getCode();
    exampleWoeFlag = false;
    waitForBoth.countDown();
    }
  }
});
}

还有关于那个的doco...

http://parse.com/docs/android/api/com/parse/ParseQuery.html#findInBackground(com.parse.FindCallback)

4

1 回答 1

1

Parse SDK 确实创建了一个新线程,但“完成”方法正在 UI 线程上运行。这意味着您在 UI 线程上调用“countDown”,但您永远无法到达那里,因为您已经在其上调用了“await”。

您可以通过创建自己的线程并在其中传递 CountDownLatch 来解决它。然后使用 Parse 的同步方法

那有意义吗 ?如果我错了,有人纠正我

顺便说一句,目前在 coursera ( https://www.coursera.org/course/posa ) 上运行了一个很好的(免费)课程,讨论了 Android 中的 CountDownLatch。

亲切的问候安东

于 2014-06-24T17:35:15.153 回答