在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().
标签:clean-architecture,android,rx-java,android-mvp 来源: https://codeday.me/bug/20190724/1522382.html