编程语言
首页 > 编程语言> > 在RxJava上使用Android上的干净MVP:如何在仍然观察UI线程的同时保持演示者没有任何Android知识?

在RxJava上使用Android上的干净MVP:如何在仍然观察UI线程的同时保持演示者没有任何Android知识?

作者:互联网

为了在android上使用mvp模式实现“干净”架构,建议将android框架视为插件,而不是将任何知识产权感知依赖项泄漏到presenter层.使用rxjava,如果我有一个设计用于将数据“推送”到视图层的演示者,我可能希望有这样的逻辑:

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

但是,通过观察’AndroidSchedulers.mainThread()’,这会强制依赖于:

import io.reactivex.android.schedulers.AndroidSchedulers

在这一点上,我的主持人现在知道android并且与之相关;我想避免.

处理这个的建议方法是什么,以便保证在Android的UI(主)线程上将结果传递给ViewLayer,而演示者不保持与android相关的任何依赖?

解决方法:

AndroidSchedulers.mainThread()使用Android代码在主线程上安排操作,不要直接在演示者中使用它.
您可以重构演示者以在其构造函数中使用Scheduler,在生产代码中使用常规的AndroidSchedulers.mainThread()和Schedulers.io(),在测试中您只需发送Schedulers.trampoline()或Schedulers.immediate().

在此示例中看到此模式:https://github.com/riggaroo/GithubUsersSearchApp/blob/master/app/src/main/java/za/co/riggaroo/gus/presentation/search/UserSearchPresenter.java

和它的测试类在这里:
https://github.com/riggaroo/GithubUsersSearchApp/blob/8b83095d7a2cc8f3cb69a945224ab4c37cf54a37/app/src/test/java/za/co/riggaroo/gus/presentation/search/UserSearchPresenterTest.java

标签:clean-architecture,android,rx-java,android-mvp
来源: https://codeday.me/bug/20190724/1522382.html