Эта строка не работает:
intent.putExtra(DATABASE_ID, callback);
Чтобы поместить объект в Intent
, он должен реализовывать интерфейс Serializable
/ Parcelable
. Более того, это же требование распространяется на все поля объекта.
Хотя ваш callback
объект (который относится к типу DatabaseSyncService.SyncProgressCallback
) реализует Serializable
, но он создается из внутреннего класса callback = new DatabaseSyncService.SyncProgressCallback() {...}
. Согласно это , java.io.NotSerializableException
происходит в вашем случае, потому что:
- сериализация такого экземпляра внутреннего класса также приведет к сериализации ассоциированного с ним экземпляра внешнего класса
- Сериализация внутренних классов (т. Е. Вложенных классов, которые не являются статическими классами-членами), включая локальные и анонимные классы, настоятельно не рекомендуется
Это означает, что вы должны сделать так, чтобы ваш внешний класс UploadDatabaseAsyncTask
реализовывал Serializable
, который, в свою очередь, должен применяться ко всем его полям и т. Д.
Это довольно расстраивает.
Как правило, рассмотрите возможность поместить что-то более легкое / чистое, а не сложные объекты со сложными зависимостями в Intent
.
Возвращаясь к вашему коду, одним простым исправлением может быть передача объекта callback
в метод DatabaseSyncService.enqueueWork
:
//intent.putExtra(DATABASE_ID, callback);
intent.putExtra("LOCATION", location);
DatabaseSyncService.enqueueWork(activity, intent, callback);
Внутри enqueueWork()
используйте callback
напрямую вместо десериализации из намерения.