2017-10-06 15 views
2

J'ai mon abonnement Observable qui ressemble à:Existe-t-il un moyen de refactoriser ce code 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(); 
          })); 

Est-il possible de faire abstraction de tout le code dans la méthode subscribe() à une méthode distincte? Je l'ai essayé de faire ceci:

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

Mais je reçois une erreur: type cible d'une conversion lambda doit être une interface.

Alors, y a-t-il un moyen de refactoriser ce code? Comment puis-je même connaître la valeur de retour attendue?

Répondre

2

Je l'ai compris. La signature de la méthode que je besoin de deux paramètres de consommation de sorte que le grand bloc de code que j'avais pu être refactorisé à ceci:

compositeDisposables.add(githubService.getRepos() 
        .subscribeOn(Schedulers.io()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(
          successResponse(), 
          errorResponse() 
        )); 

Et puis les paramètres ressemblait à:

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

Et

 private Consumer<Throwable> errorResponse() { 
    return (Throwable e) -> { 
     e.printStackTrace(); 
     Toast.makeText(this, "Cannot load repositories", Toast 
       .LENGTH_SHORT).show(); 
    }; 
}