有没有办法重构这段RxJava代码?

问题描述 投票:0回答:2

我的 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 转换的目标类型必须是接口。

那么,有没有办法重构这段代码呢?我怎么知道预期的回报值?

android lambda refactoring rx-java
2个回答
2
投票

我想通了。我使用的方法签名需要两个 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();
    };
}

0
投票

1 应用数据 04-17 18:29:55.076 12360 12417 I GnpSdk:GrowthKit 被表型标志禁用。 04-17 18:29:55.076 12360 12414 我 com.google.andr oidlbraries.phenotype.client.Phlogger$PhClient:无法检索 com.google.android.libraries.notifications.platfor m#tcom.google.android 的标志快照.apps.messaging,使用默认值。 04-17 18:29:55.079 12360 12390I com.google.apps.tiktok.sync.impl.SyncManagerlmpl:#poke0。调度工作人员 04-17 18:29:55.080 12360 12418 我 com.google.andr oid.libraries.phenotype.client.Phlogger$PhClient:无法检索 com.google.android.libraries.internal.growth.growt hkit 的标志快照#com.google.android.apps.messaging,使用默认值。 04-17 18:29:55.084 12360 12393I com.google.apps.tiktok.sync.impl.SyncManagerlmpl;完成同步。安排下一次唤醒 04-17 18:29:55.084 12360 12393I com.google.apps.tiktok.sync.impl.workmanager.SyncWorkManagerOneTimeScheduler:安排下一次一次性 WorkManager 工作人员 04-17 18:29:55.096 12360 12398 I com.google. andr oid.libraries.phenotype.client.Phlogger$PhClient:无法使用默认值检索 com.google.android.libraries.performance.prime s#com.google.android.apps.messaging 的标志快照。 04-17 18:29:55.113 12360 12421 我 com.google.apps.ti ktok.account.data.google.GmsAccounts:GMSCore 身份验证返回 0 个帐户。 04-17 18:29:55.114 12360 12421 我 com.google.a pps.tiktok.account.data.google.GmsAccounts:GoogleOwnersProvider 返回 0 个帐户。 04-17 18:29:55.138 12360 124201 com.google.apps.tiktok.sync.impl.workmanager.SyncWorkManagerOneTimeScheduler:已成功安排下一个一次性工作人员 04-17 18:29:55.144 12360 12392I com.google.apps.tiktok。 sync.impl.SyncManagerlmpl:onAccountsChanged:检查并可能重新安排synclet绑定04-17 18:29:55.148 12360 12400 | com.google.apps.tiktok.sync.impl.SyncManagerlmpl;账户确实发生了变化。重新安排同步。 04-17 18:29:55.149 12360 12400| com.google.apps.tiktok.sync.impl.SyncManagerlmpl:已完成同步。安排下一次唤醒 04-17 18:29:55.149 12360 124001 com.google.apps.tiktok.sync.impl.workmanager.SyncWorkManagerOneTimeScheduler:安排下一次一次性 WorkManager 工作人员 04-17 18:29:55.153 12360 12360 I zdy:添加新的主页片段 [CONTEXT android_log_tag="BuglePaginationV3" ] 04-17 18:29:55.155 12360 12360 I com.google.and roid.apps.messaging.home.HomeFragmentPeer: HomeFragment onAttach 称为 [CONTEXT android_log_tag="BuglePaginationV3" ] 04- 17 18:29:55.155 12360 12360 我 com.google.and roid.apps.messaging.home.HomeFragmentPeer: HomeFragment onCreate 称为 [CONTEXT android_log_tag="BuglePaginationV3" ] 04-17 18:29:55.185 12360 12360 I

© www.soinside.com 2019 - 2024. All rights reserved.