java - Android Retrofit2/RxJava2/Room - 简单数据处理
问题描述
我正在开发应用程序,在应用程序启动时,我从 Rest 服务下载类别和帖子,以便将它们存储在 SQLite 数据库中。我有几个问题:
- 如何确定哪个对象是类别和哪个帖子?或者我怎样才能访问它们?
objects
变量很奇怪。 - 我应该将使用 Room 库在数据库中插入项目的代码放在哪里?
- 我需要为每个帖子下载图片,我应该在哪里下载?
代码:
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,将并行下载图像、插入到 db 等结合起来。所有这些都应该是可观察的,并与 zip 结合使用。
您可以根据zip
需要组合任意数量的可观察对象,它们的结果将作为组合函数的参数提供。
推荐阅读
- excel - Excel 公式,根据所需的最低利润 (GP%) 计算最大权重
- c - c 中的连接字符:“char”类型的参数与“const char*”类型的参数不兼容
- python - KeyError: word not in words,当我使用 gensim.Word2Vec 处理中文标记时
- c++ - 在 C++ 中将我的类分成不同的头文件
- firebase - Dialogflow 从 Firebase 实时数据库中检索数据
- mysql - 选择具有非空值列的记录
- blackjack - 二十一点缺失算法
- javascript - 如何为复制到剪贴板制作多重选择器或多重ID
- android - 扫描每个像素以获取 RGB 值
- google-chrome - Chrome 版本 66:阻止当前来源接收跨站点文档