使用 RxJava 2 和 Retrofit 2 从 Observable 对象中检索数据

Retrieving data from Observable object using RxJava 2 and Retrofit 2

我刚刚开始学习如何在 Android 中使用 RxJava 2 和 Retrofit 2。我已经学习了一些教程,并且能够从我的服务器中检索数据。我的问题是,轻松访问检索到的数据的标准方法是什么。目前 GSON 将其解析为一个对象,我打印了 toString,仅此而已。

我有这个接口来定义我的 POST 请求:

public interface FacebookAppLoginService {
    @POST("app/fbapp_login")
    Observable<User> getUser(@Body FacebookAccessToken facebookAccessToken);
}

我创建了 Retrofit 对象:

    Retrofit retrofit = new Retrofit.Builder()
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl("http://rocky-garden-56471.herokuapp.com/")
            .build();

然后我创建一个对象来包含我的 POST 请求的 JSON 主体:

FacebookAccessToken facebookAccessToken = new FacebookAccessToken();

然后我从我的界面创建 Observable:

Observable<User> newUser = facebookAppLoginService.getUser(facebookAccessToken);

最后,我订阅了 observable,在主线程上观察,但在工作线程上执行请求(我认为),然后记录结果:

newUser.subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(userInfo -> {
                        Log.i("Server Call", "Received: " + userInfo.toString());
                });

toString 正确打印出从服务器接收到的用户信息。使用我在 lambda 函数中获得的这个对象的标准方法是什么?我想将它存储在数据库中,或者至少将它保存在 activity 内的一个对象中。我应该怎么做?

你对线程发生的事情的解释是正确的。您正在新线程上执行请求,subscribe() 中的 lambda 将在 UI-thread

上调用

您可以将其余代码编写在 lambda 函数中。您可以访问周围的 class 并将其存储在那里的字段中或从那里访问数据库 class/method。注意这里如果想访问ui只需要在主线程上观察即可。如果你只想保存它,你可以删除 observeOn() 调用并留在后台线程中。此外,我建议对 subscribeOn() 使用 Schedulers.io(),因为它是一个线程池,用于 io 操作,包括网络操作和数据库访问。