Android Parse SDK を使用して Android アプリを構築しています。これは、初期化時に Parse からすべてのデータを取得し、ローカルに保存します。後で、必要なエンティティ (ParseObjects) のみを更新します。一部の Pin() 操作からは何も返されません。同様に、PinInBackground() とバリアントを使用するとコールバックもありません。Unpin() でも同じことが起こります。
私のコードは次のようなものです。Parse データ テーブルごとに updated_at と updated_locally_at を含む ParseObject である ControlDate のリストがあります。これを使用して、特定のテーブルをクエリする必要があるかどうかを判断します (クエリの数を減らします)。次のように、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() の再帰的な性質による可能性があると思います。ただし、d.pin() の場合のように、他を参照しない ParseObjects でスタックすることもあるのが奇妙です。
私が試したこと:
- forループをListIteratorに変更します(ControlDatesのリストを変更しているためですが、これは必要ではないと思います)。
- スレッド化されたバリアントの使用 (例: PinInBackground()) - コールバックなし。
- 各エンティティを個別にピン留めする (ループ内で pin() を実行する) - かなり遅く、それでもスタックします。
- デバッグ - スレッドはここでブロックするだけです: http://i.imgur.com/oBDjpCw.png?1
私はこれに夢中になっています、助けていただければ幸いです!
PS .: これを見つけましたhttps://github.com/BoltsFramework/Bolts-Android/issues/48 これは、Android SDK で使用されているボルト ライブラリの未解決の問題であり、これを引き起こしている可能性があります (多分?)。とにかく、 pin() が返されない原因がデッドロックにつながる「観察されていない例外」である可能性があるにもかかわらず、どうすれば問題を解決できるかわかりません。