Dans le but d'implémenter une architecture «propre» sur android avec le modèle mvp, il est conseillé de traiter l'infrastructure android comme un plugin et de ne laisser aucune dépendance aux fonctions Android dans la couche de présentation. En utilisant rxjava, si j'ai un présentateur qui est conçu pour les données « push » à la couche de vue je veux avoir la logique comme ceci:Utiliser MVP propre sur Android avec RxJava: Comment pouvez-vous garder le présentateur libre de toute connaissance Android tout en observant sur le fil de l'interface utilisateur?
public interface SearchPresenter {
interface ViewLayer {
void updateResults(List<SearchResult> searchResults)
}
void bind(ViewLayer viewLayer);
void unbind();
}
public class SearchPresenterImpl implements SearchPresenter {
ViewLayer viewLayer;
CompositeDisposable compositeDisposable;
@Override
public void bind(ViewLayer viewLayer) {
this.viewLayer = viewLayer;
compositeDisposable = new CompositeDisposable();
compositeDisposable.add(
searchInteractor.getSearchResults()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::refreshView));
}
private void refreshView(List<SearchResult> searchResults) {
//send the results back to the view layer to update a RecyclerView
viewLayer.updateResults(searchResults)
}
@Override
public void unbind() {
compositeDisposable.dispose();
}
Cependant, en observant le «AndroidSchedulers.mainThread() ce forces une dépendance sur:
import io.reactivex.android.schedulers.AndroidSchedulers
à quel point, mon présentateur connaît maintenant Android et est lié à elle; que je veux éviter.
Quel est le moyen conseillé de gérer cela afin que le résultat est garanti pour être livré à la ViewLayer sur le fil de l'interface utilisateur (principale) android tandis que le présentateur ne maintient aucune dépendance à quoi que ce soit Android?
Peut-être que l'interface ViewLayer nécessite une méthode comme 'Observable getThread();'? – 0X0nosugar