Я пытаюсь передать свой настраиваемый объект из одного действия другому. Поэтому я использовал следующий код:
В welcomeActivity.java: (реализует сериализуемый, также QuestionRepository.java реализует сериализуемый)
Intent intent = new Intent(WelcomeActivity.this,QuestionActivity.class);
intent.putExtra("category", 1);
intent.putExtra("qustionRepository", questionRepository);
startActivity(intent);
Под вопросомActivity.java:
questionRepository = (QuestionRepository) getIntent().getSerializableExtra("questionRepository");
Во время выполнения я получил эту ошибку:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.user.loginactivity, PID: 16608
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.user.repository.QuestionRepository)
at android.os.Parcel.writeSerializable(Parcel.java:1316)
at android.os.Parcel.writeValue(Parcel.java:1264)
at
...
Caused by: java.io.NotSerializableException: com.example.user.repository.BaseRepository_Impl$4
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
at
...
BaseRepository - это интерфейс, расширяющий сериализуемые.
@Dao
public interface BaseRepository extends Serializable {
@Query("SELECT * FROM User")
List<User> getAllUserScores();
@Query("SELECT * FROM user where first_name LIKE :firstName AND last_name LIKE :lastName")
User findUserByName(String firstName, String lastName);
@Insert
void insertUser(User user);
@Delete
void deleteUser(User user);
@Insert
void insertQuestion(Question question);
@Delete
void deleteQuestion(Question question);
@Query("Select * from Question")
List<Question> getAllQuestions();
}
Как я понял из своих исследований, реализации сериализуемого достаточно для передачи объектов между активностями, но, видимо, я что-то упустил. Где я делаю не так? Спасибо




implementing serializable is enough to pass objects between activites
Да, но для реализации Serializable все, что класс Java удерживает в полях, должно быть Serializable. В этом случае вы не писали класс Java - он создается для вас с помощью Room.
Ваш RoomDatabase с BaseRepository должен быть синглтоном; оба действия могут получить доступ к этому синглтону для работы с BaseRepository.
В общем, передача произвольных объектов через дополнительные функции Intent - это запах кода. Android должен сделать 2+ копии этих объектов как часть запуска другого компонента (в данном случае, запуска действия), и эти копии передаются между процессами ОС.
com.example.user.repository.BaseRepository_Impl$4 - это сгенерированный класс, который, согласно исключению, не реализует Serializable.
.
Передача DAO из одного действия в другое не имеет смысла. Экземпляры Service / Dao являются зависимостями и не имеют состояния. Поэтому вместо этого вы должны вводить их в каждое действие / компонент, где они необходимы.
Как я могу добавить их в свой класс QuestionActivity?
Кинжал 2 например.
Вы не можете использовать Serializable для сложного объекта, вам нужно реализовать Parcelable, который требует большого количества шаблонов, я бы рекомендовал библиотеку как Parceler (https://github.com/johncarl81/parceler), чтобы упростить
Теперь я могу перейти к активности QuestionActivity, но мой questionRepository возвращает null после этого: "questionRepository = getIntent (). GetParcelableExtra (" questionRepository ");" в вопросе активности. Это почему?
Теперь я получил предысторию ошибки, большое спасибо.