java - Android Retrofit2/RxJava2/Room——简单的数据处理

标签 java android retrofit2 rx-java2 android-room

我正在开发应用程序,在应用程序启动时,我正在从 Rest 服务下载类别和帖子,以便将它们存储在 SQLite 数据库中。我有几个问题:

  1. 如何确定哪个对象是类别,哪个是帖子?或者我怎样才能访问它们? objects 变量很奇怪。
  2. 我应该把用于在数据库中插入项目的代码放在哪里 使用 Room 库?
  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();
}

最佳答案

这里是答案:

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

这里有每个类型的参数(categoriesList、postsList),List 和 List。

2) 你应该把你的代码放在我在评论中指定的地方。确保你在正确的线程中拥有它

3) 下载图片也可以在那里完成。您可以在函数中有另一个 zip-s,结合并行下载图像、插入数据库等。所有这些都应该是可观察的,与 zip 结合。

zip 中,您可以根据需要组合任意数量的 observable,它们的结果将作为组合函数的参数提供。

关于java - Android Retrofit2/RxJava2/Room——简单的数据处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54776246/

相关文章:

java - Activity 主错误

android - 我在单行中查看三个图像如何在下一行显示重新挖掘图像

android - 发送 JSON 数组改造 2 (ANDROID)

android - retrofit2中不同api添加通用参数

android - android中的按钮图像大小

android - 如何在状态代码为 400 时使用 Retrofit 和 RxJava 来获取错误消息?

java - 如何使用正则表达式删除字符之间的符号

java - 在迭代中使用 LambdaJ 严重缺乏效率

java - 如何在Java中读取CSV文件中一行中以逗号分隔的两个或多个单词?

java - JSF 2.0 注释不起作用