У меня есть два немного разных класса вопросов. Один из них представляет собой модифицированный объект результатов вызова, а другой — объект Room @Entity в моем приложении для Android.
И теперь я хочу, чтобы мой класс Interactor (использование) делал следующее:
Теперь проблема, с которой я сталкиваюсь, заключается в создании этого потока с помощью RxJava из моего класса Interactor.
Вот все классы и звонки. Во-первых, это мой метод Interactor.class, который должен выполнять поток, описанный выше:
public Single<List<Question>> getQuestionByCategoryMultiple(String parameter);
ВЫЗОВ API из MyAPI.class:
//this Question is of database.Question.
Single<List<Question>> getQuestionByCategory(String parameter);
Репозиторий базы данных Room.class:
Single<Long> addGameReturnId(Game game);
Completable addQuestions(List<Question> questions);
Конвертер.класс:
public static List<database.Question> toDatabase(List<retrofit.Question> toConvert, int id);
У меня возникли проблемы с созданием потока, описанного выше, с помощью этих методов. Я пробовал сочетание .flatmap, .zip, .doOnSuccess и т. д. без успешного создания потока.
Если есть что-то еще, что вам нужно, чтобы я объяснил или объяснил проблему лучше, пожалуйста, прокомментируйте ниже.
public Single> getQuestionByCategoryMultiple (строковые параметры) {
return openTDBType
.getQuestionByCategory(paramters) //step 1
// step 2
// step 3
.observeOn(AndroidSchedulers.mainThread()); //step 4
}
Обновлено:
Я пробовал что-то вроде этого:
return openTDBType
.getQuestionByCategory(parameters)
.map(QuestionConverter::toDatabase)
.flatMap(questions -> {
int id = gameRepositoryType.addGameReturnId(new Game(parameters).blockingGet().intValue();
questions.forEach(question -> question.setqId(id));
gameRepositoryType.addQuestions(questions);
return gameRepositoryType.getAllQuestions(); })
.observeOn(AndroidSchedulers.mainThread());
^^ Я не знаю, лучший ли это способ сделать это? Может ли кто-нибудь подтвердить, является ли это хорошим способом разработки того, что я хочу здесь сделать, или есть ли лучшие способы или какие-либо предложения?
@EpicPandaForce Не могли бы вы объяснить, что вы имеете в виду, я не совсем понимаю?
Старайтесь не использовать blockingGet, особенно когда этого можно избежать. Кроме того, addQuestions вообще не будет выполняться, потому что на него нет подписки. Вы можете добавить как addGameReturnId, так и addQuestions в цепочку следующим образом:
return openTDBType
.getQuestionByCategory(parameters)
.map(QuestionConverter::toDatabase)
.flatMap(questions -> {
return gameRepositoryType.addGameReturnId(new Game(parameters)) // returns Single<Long>
.map(id -> {
questions.forEach(question -> question.setqId(id));
return questions;
})
}) // returns Single<List<Question>> with the GameId attached
.flatMapCompletable(questions -> gameRepositoryType.addQuestions(questions)) // returns Completable
.andThen(gameRepositoryType.getAllQuestions()) // returns Single<>
.observeOn(AndroidSchedulers.mainThread());
Извините за позднее принятие. Это было почти то, что мне было нужно, так как flatMapCompletable() был ключом к созданию моего потока. Спасибо!
Меня смущает, почему Room DAO не отображает свои значения как
Observable(илиFlowable, в зависимости от того, что поддерживается).