RxJava Observable 和改造 API 调用
RxJava Observable and retrofit API calls
我正在开发一个简单的 github 客户端,用于从特定用户名检索存储库列表。
我的activity中有这个方法:
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
。 onNext
在我的 github 帐户上添加或删除新的存储库时,不应该被调用吗?
这实际上不是反应流使用 Retrofit 处理网络请求的方式。
对于网络请求,一旦您订阅了一个事件并收到了它的数据,就是这样。流已完成(您可以检查此日志记录 onComplete
回调)。
虽然您可以使用它进行 map、switch、concat 等操作,但它不是“实时”订阅。
如前所述:“使用 RxJava 改造网络调用: 使用单一:因为我们的 API 不会一次性或多次提供数据. 相反,它只会在一次调用中发出所有内容。因此,在 Observable 的情况下,一旦 onNext() 发生,onCompleted() 就会随之而来。"
如果你想要(几乎)实时的东西,你可以安排一个工作,每隔几分钟(或几秒钟,或任何你想要的时间段)进行一次 api 调用。注意数据泄漏和线程处理!
我正在开发一个简单的 github 客户端,用于从特定用户名检索存储库列表。
我的activity中有这个方法:
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
。 onNext
在我的 github 帐户上添加或删除新的存储库时,不应该被调用吗?
这实际上不是反应流使用 Retrofit 处理网络请求的方式。
对于网络请求,一旦您订阅了一个事件并收到了它的数据,就是这样。流已完成(您可以检查此日志记录 onComplete
回调)。
虽然您可以使用它进行 map、switch、concat 等操作,但它不是“实时”订阅。
如前所述
如果你想要(几乎)实时的东西,你可以安排一个工作,每隔几分钟(或几秒钟,或任何你想要的时间段)进行一次 api 调用。注意数据泄漏和线程处理!