Я работаю над приложением, где при запуске приложения я загружаю категории и сообщения из сервиса Rest для хранения их в базе данных SQLite. У меня есть несколько вопросов:
objects
довольно странная.Код:
ItemsApi client = this.getClient(); // Retrofit2
List<Observable<?>> requests = new ArrayList<>();
requests.add(client.getCategories());
requests.add(client.getPosts());
Observable<Object> combined = Observable.zip(
requests,
new Function<Object[], Object>() {
@Override
public Object apply(Object[] objects) throws Exception {
Timber.d("Length %s", objects.length); // Length 2
Timber.d("objects.getClass() %s", objects.getClass()); // objects.getClass() class [Ljava.lang.Object;
return new Object();
}
});
Disposable disposable = combined.subscribe(
new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Timber.d("Object %s", o.toString());
}
},
new Consumer<Throwable>() {
@Override
public void accept(Throwable e) throws Exception {
Timber.d("error: %s", e.toString());
}
}
);
private ItemsApi getClient() {
Retrofit.Builder builder = new Retrofit
.Builder()
.client(this.getOkHttpClient())
.addConverterFactory(GsonConverterFactory.create(this.getGson()))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.baseUrl(Config.WEBSERVICE_URL_PREFIX);
return builder.build().create(ItemsApi.class);
}
ItemsApi.class:
public interface ItemsApi {
@GET("categories")
Observable<List<CategoryEntity>> getCategories();
@GET("posts")
Observable<List<ArticleEntity>> getPosts();
}
Вот ответы:
1) Для параллельных запросов вы должны использовать Observable.zip, вот так
Observable<Boolean> obs = Observable.zip(
client.getCategories(),
client.getPosts(),
(categoriesList, postsList) -> {
// you have here both categories and lists
// write any code you like, for example inserting to db
return true;
});
Здесь у вас есть параметры (categoryList, postsList) каждого из его типов, List и List.
2) Вы должны поставить свой код там, где я указал в комментариях. Убедитесь, что он у вас в правильной теме
3) Загрузка изображений также может быть сделано там. Вы можете использовать другой zip
в функции, комбинируя параллельную загрузку изображений, вставки в БД и т.д. Все они должны быть наблюдаемыми в сочетании с zip.
В zip
вы можете объединить столько наблюдаемых, сколько пожелаете, их результаты будут доступны в виде параметров функции объединения.
1._ Вы пытались добавить addConverterFactory of Retrofit?
Retrofit restAdapter = new Retrofit.Builder().baseUrl("https://abc")
.addConverterFactory(GsonConverterFactory.create(new Gson()))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
RestAuthenticationService restAuthenticationService = restAdapter.create(RestAuthenticationService.class);
В RestAuthenticationService.class:
public interface RestAuthenticationService {
@POST("security/login")
Observable<User> login(@Body LoginRequest loginRequest);
}
apply
? Или вaccept
?