Android Retrofit2 / RxJava2 / Room - Простая обработка данных

1

Я работаю над приложением, где при запуске приложения я загружаю категории и сообщения из сервиса Rest для хранения их в базе данных SQLite. У меня есть несколько вопросов:

  1. Как я могу определить, какой объект является Категория и какой пост? Или как я могу получить к ним доступ вообще? Переменная objects довольно странная.
  2. Где я должен поместить код для вставки элементов в базу данных с помощью библиотеки номеров?
  3. Мне нужно скачать картинки для каждого поста, где мне это делать?

Код:

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();
}
Теги:
android-room
retrofit2
rx-java2

2 ответа

4
Лучший ответ

Вот ответы:

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 вы можете объединить столько наблюдаемых, сколько пожелаете, их результаты будут доступны в виде параметров функции объединения.

0

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);

}
  1. Вы имеете в виду обрабатывать данные кэширования на локальном уровне? Я думаю, что вы должны использовать Realm вместо Room/native SQLite.

  2. Вы должны использовать Пикассо или Glide.

  • 0
    Я обновил пост и добавил больше кода. 1. Смотрите мой пример. 2. Мне нужно сделать полнотекстовый поиск после загрузки контента, поэтому SQLite - это выбор. 3. Где я должен поставить код для скачивания? В apply ? Или в accept ?
  • 0
    Я думаю, что следует изменить способ использования RxJava с модернизацией, посмотрите здесь: stackoverflow.com/questions/34741970/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню