【问题标题】:Android Retrofit2/RxJava2/Room - Simple Data ProcessingAndroid Retrofit2/RxJava2/Room - 简单数据处理
【发布时间】:2019-07-13 13:07:42
【问题描述】:

我正在开发应用程序,在应用程序启动时,我从 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. objects variable is pretty strange 因为您没有使用正确的 POJO 类进行响应(或将其强制转换为您想要的 POJO 类)。 2. 示例 JSON 响应在哪里? 3. 不用下载图片,直接使用图片加载库即可。
  • @Shashanth 我在帖子中添加了更多代码。 1.apply方法中一定要使用POJO吗? 2.重要吗?服务返回对象。 3. 我需要下载它们

标签: java android retrofit2 rx-java2 android-room


【解决方案1】:

以下是答案:

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) 你应该把你的代码放在我在 cmets 中指定的地方。确保你把它放在正确的线程中

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

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

【讨论】:

    【解决方案2】:

    1._ 你试过addConverterFactory的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. 您应该使用PicassoGlide

    【讨论】:

    • 我更新了帖子并添加了更多代码。 1.看我的例子。 2.我需要下载内容后进行全文搜索,所以选择SQLite。 3. 我应该把下载代码放在哪里?在apply?还是在accept
    • 我认为应该改变使用 RxJava 和改造的方式,看看这里:stackoverflow.com/questions/34741970/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2018-03-09
    • 2017-10-27
    • 2018-07-15
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多