Joh*_*ock 4 android rx-java clean-architecture android-mvp
为了在Android上使用mvp模式实现"干净"架构,建议将android框架视为插件,而不是将任何知识产权感知依赖项泄漏到演示者层.使用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();
}
Run Code Online (Sandbox Code Playgroud)
但是,通过观察'AndroidSchedulers.mainThread()',这会强制依赖于:
import io.reactivex.android.schedulers.AndroidSchedulers
Run Code Online (Sandbox Code Playgroud)
在这一点上,我的主持人现在知道android并且与之相关; 我想避免.
处理这个的建议方法是什么,以保证结果在Android的UI(主)线程上传递给ViewLayer,而演示者维护没有任何与Android相关的依赖?
小智 7
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