2017-10-06 67 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(); 
    }; 
}