繁体   English   中英

RxJava Observable 和 retrofit API 调用

[英]RxJava Observable and retrofit API calls

我正在开发一个简单的 github 客户端,它从特定用户名检索存储库列表。

我的活动中有这种方法:

private void subscribeRepos(Observable<List<Repository>> repository) {
    disposable.add(repository
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableObserver<List<Repository>>() {
                @Override
                public void onComplete() {

                }

                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                }

                @Override
                public void onNext(List<Repository> list) {
                    adapter.setItems(list);
                    System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> onNext Called");
                }
            }));
}

这是我的 Retrofit 服务:

public class RetrofitService {

private static final String BASE_URL = "https://api.github.com/";
private RepoAPI repoAPI;
private static RetrofitService INSTANCE;

/**
 * Method that returns the instance
 * @return
 */
public static RetrofitService getInstance() {
    if (INSTANCE == null) {
        INSTANCE = new RetrofitService();
    }
    return INSTANCE;
}

private RetrofitService() {
    Retrofit mRetrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl(BASE_URL)
            .build();
    repoAPI = mRetrofit.create(RepoAPI.class);
}

/**
 * Method that returns the API
 * @return
 */
public RepoAPI getRepoApi() {
    return repoAPI;
}

}

还有我的 RepoAPI 接口

public interface RepoAPI {

@GET("/users/{user_name}/repos")
Observable<List<Repository>> getRepositories(@Path("user_name") String userName);

}

所以,每当我主动调用subscribeRepos(mainViewModel.getRepositories("whateverusername")); onNext 按预期触发。 但是,如果我在我的 github 帐户上手动创建一个新存储库,则不会调用onNext 在我的 github 帐户上添加或删除新回购时,不应该调用onNext吗?

这实际上不是反应流与使用 Retrofit 的.network 请求一起工作的方式。对于.network 请求,一旦您订阅了一个事件并收到它的数据,就是这样。 stream 完成(你可以检查这个 logging onComplete回调)。 虽然您可以使用它进行 map、switch、concat 等操作,但它不是“实时”订阅。

正如这里所说:“ Retrofit 使用 RxJava 的网络调用:使用单一:因为我们的 API 不会一次性或多次提供数据。相反,它只会在一次调用中发出所有内容。因此,在 Observable 的情况下,onCompleted() 将如下所示一旦 onNext() 发生。”

如果你想要(几乎)实时的东西,你可以安排一个工作,每隔几分钟(或几秒钟,或你想要的任何时间段)拨打这个 api 电话。 注意数据泄漏和线程处理!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM