0

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

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

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

我创建改造对象:

    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 函数中使用这个对象的标准方法是什么?我想将它存储在数据库中,或者至少将它保存在活动中的对象中。我该怎么做呢?

4

1 回答 1

1

您对线程发生的事情的解释是正确的。您正在一个新线程上执行请求,并且 subscribe() 中的 lambda 将在 UI 线程上调用

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

于 2017-01-24T18:14:54.027 回答