我的 Observable 订阅如下所示:
compositeDisposables.add(githubService.getRepos()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
(List<GithubRepo> value) -> {
if (!value.isEmpty()) {
ArrayAdapter<GithubRepo> adapter = new
ArrayAdapter<GithubRepo>
(MainActivity.this,
android.R.layout.simple_spinner_dropdown_item, value);
reposSpinner.setAdapter(adapter);
reposSpinner.setEnabled(true);
} else {
showEmptyRepoAdapterState();
}
},
(Throwable e) -> {
e.printStackTrace();
Toast.makeText(this, "Cannot load repositories", Toast
.LENGTH_SHORT).show();
}));
有没有办法将 subscribe() 方法中的所有代码抽象为单独的方法?我尝试过这样做:
private DisposableSingleObserver<List<GithubRepo>> getRepos(){
return (List<GithubRepo> value) -> {
if (!value.isEmpty()) {
ArrayAdapter<GithubRepo> adapter = new ArrayAdapter<GithubRepo>
(MainActivity.this,
android.R.layout.simple_spinner_dropdown_item, value);
reposSpinner.setAdapter(adapter);
reposSpinner.setEnabled(true);
} else {
showEmptyRepoAdapterState();
}
},
(Throwable e) -> {
e.printStackTrace();
Toast.makeText(this, "Cannot load repositories", Toast
.LENGTH_SHORT).show();
};
};
但我收到错误:lambda 转换的目标类型必须是接口(interface)。
那么,有没有办法重构这段代码?我怎么知道预期的返回值?
最佳答案
我明白了。我使用的方法签名需要两个 Consumer 参数,因此我拥有的巨大代码块可以重构为:
compositeDisposables.add(githubService.getRepos()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
successResponse(),
errorResponse()
));
然后参数看起来像:
private Consumer<List<GithubRepo>> successResponse() {
return (List<GithubRepo> value) -> {
if (!value.isEmpty()) {
ArrayAdapter<GithubRepo> adapter = new ArrayAdapter<GithubRepo>
(MainActivity.this,
android.R.layout.simple_spinner_dropdown_item, value);
reposSpinner.setAdapter(adapter);
reposSpinner.setEnabled(true);
} else {
showEmptyRepoAdapterState();
}
};
}
还有
private Consumer<Throwable> errorResponse() {
return (Throwable e) -> {
e.printStackTrace();
Toast.makeText(this, "Cannot load repositories", Toast
.LENGTH_SHORT).show();
};
}
关于android - 有没有办法重构这个 RxJava 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46614914/