2

我正在使用 Android Parse SDK 构建一个 android 应用程序,它在初始化时从 Parse 获取所有数据并将其存储在本地。稍后,它只会更新那些需要的实体(ParseObjects)。我没有从某些 Pin() 操作中获得任何回报,同样,当我使用 PinInBackground() 和变体时也没有回调。Unpin() 也是如此。

我的代码如下所示。我有一个 ControlDate 列表,这是一个 ParseObject,其中包含每个 Parse 数据表的 updated_at 和 updated_locally_at。我用它来决定是否应该查询给定的表(减少查询次数)。当我在 IntentService 中执行数据更新时,我会遍历此列表,如下所示:

protected void onHandleIntent(Intent intent) {

for(ControlDate d : mUpdateQueue) { // mUpdateQueue is the list of ControlDate
    if(d.entityNeedsUpdate()) { // returns true if updated_at > updated_locally_at   
        updateEntity(d);
    }   
}

private boolean updateEntity(ControlDate d) {
    String tableName = d.getTableName();   
    Date lastLocalUpdate = d.getLastLocalUpdate();
    ParseQuery<ParseObject> qParse = ParseQuery.getQuery(tableName);  
    qParse.whereGreaterThan("updated_at", lastLocalUpdate);    
    try {   
        // update the entities       
        List<ParseObject> entities = qParse.find();       
        ParseObject.pinAll(entities); // SOMETIMES GETS STUCK (no return)

        // update the associated ControlDate       
        d.setLastLocalUpdate(new Date());  // updated_locally_at = now
        d.pin();  // SOMETIMES GETS STUCK (no return)
    }   
    catch(ParseException e) {   
         // error
    }   
}

}

这些操作有时不会返回。我正在尝试找到一种模式,但仍然没有运气,显然它是在我向某些实体添加指针数组时开始发生的。因此,我认为这可能是由于 pin() 的递归性质。然而奇怪的是,它有时也会被不引用任何其他对象的 ParseObjects 卡住 - d.pin() 就是这种情况。

我尝试过的事情:

  • 将 for 循环更改为 ListIterator(因为我正在更改 ControlDates 列表,但我认为这没有必要);
  • 使用线程变体(例如:PinInBackground()) - 没有回调;
  • 单独固定每个实体(在一个循环中,做 pin()) - 慢得多,仍然卡住;
  • 调试 - 线程只是在这里阻塞:http: //i.imgur.com/oBDjpCw.png ?1

我对此感到疯狂,非常感谢您的帮助!

PS.:我发现这个https://github.com/BoltsFramework/Bolts-Android/issues/48 它是螺栓库上的一个未解决问题,它在 Android SDK 中使用,可能会导致这种情况(也许?)。无论如何,即使 pin() 未返回的原因可能是导致死锁的“未观察到的异常”,我也看不出如何克服我的问题。

4

0 回答 0