android - 有没有办法重构这个 RxJava 代码?

标签 android lambda refactoring rx-java

我的 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/

相关文章:

android - 在高 DPI 平板电脑或计算机上查看网页时,是否需要更改字体堆栈?

java - 将 toString() 与 EditText 一起使用时出错

android - 如何从原生相机获取特定尺寸的图像

c# - 如何在没有 Moles 或 Isolator 的情况下对使用静态类的方法进行单元测试?

android - Android中的数据库错误

java - 如何使用 lambdas java 返回对象

C# lambda IN 子句错误

lambda - 如何在 LISP 中定义 LAMBDA 函数?

java - 在Intellij中,当我提取一个ArrayList变量时,如何在左侧获得一个List?

visual-studio-2008 - 如何(visual studio 2008/Resharper)重构/自动化混合模式