Возможно, ответ лежит в более интеллектуальном наборе методов writeToParcel и createFromParcel?
Вдобавок ко всему, вы можете хранить список объектов, которые вы уже полностью написали для данной посылки, и идентифицировать их только по тегу (возможно, их локальная identityHashCode ()). (Обратите внимание, что это не глобальный список, он явно для каждой Посылки; возможно, сам хранится через полуглобальную Map<Parcel,Set<Integer> >
? Вы должны быть уверены, что набор был забыт, как только посылка была полностью написана.)
Соответствующий бит writeToParcel()
будет выглядеть примерно так:
HashSet<Integer> set = getWrittenSetFor(dest);
final int tag = identityHashCode();
if (set.contains(tag)) {
// Already sent
dest.writeInt(tag);
} else {
set.put(tag);
dest.writeInt(tag);
dest.writeValue(this);
}
Соответствующий createFromParcel()
будет немного сложнее.
Я ожидаю, что с этим методом будут скрываться проблемы, но именно с этого я и начну. Как я уже сказал, это зависит от того, гарантированно ли identityHashCode()
будет отличаться для разных объектов - обычно это происходит на 32-битных JVM (это значение базового указателя C ++). Может быть стоит просто hashCode()
(возможно, с добавлением информации о наборе?) Или, возможно, какой-то серийный номер.
Другой вариант - просто сериализовать ваши объекты в byte[]
и записать это в Parcel
, но это выглядит немного неэффективно ...