我正在使用 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() 未返回的原因可能是导致死锁的“未观察到的异常”,我也看不出如何克服我的问题。