2017-10-06 42 views
2

我有我的订阅可观察看起来像:有没有办法重构这个RxJava代码?

 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(); 
          })); 

有没有办法来抽象所有的代码在认购()方法,以一个单独的方法?我试过这样做:

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

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

回答

2

我想通了。我使用的方法签名需要两个消费者的参数,所以我不得不代码块巨大可重构这样:

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(); 
    }; 
} 
相关问题