4

mvp パターンを使用して Android に「クリーンな」アーキテクチャを実装するために、Android フレームワークをプラグインとして扱い、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();
}

ただし、「AndroidSchedulers.mainThread()」を観察することにより、次のものへの依存が強制されます。

import io.reactivex.android.schedulers.AndroidSchedulers

その時点で、私のプレゼンターはアンドロイドについて知っており、それに結びついています。避けたいこと。

プレゼンターが Android に関連するものへの依存を維持している間に、結果が Android の UI (メイン) スレッドの ViewLayer に配信されることが保証されるように、これを処理するための推奨される方法は何ですか?

4

2 に答える 2

2

Scheduler前の回答で指摘したように、のコンストラクターに注入できますがPresenter、少なくとも 2 つの可能性があります。

  1. Schedulerに直接注入できるinteractorので、 で操作を行う必要はありませんpresenter。次に、テストでモックを作成し、テストでの依存関係interactorを完全に忘れることができます。rxjava

  2. インタラクターを保持しても問題ないと思われる場合は、テストでRxJavaPluginsandを使用してスケジューラーをオーバーライドできます。RxAndroidPluginsAndroidSchedulers

したがって、定義します(Kotlin):

object RxJavaPluginHelper {

    fun setup(scheduler: Scheduler = Schedulers.trampoline()) {
        RxAndroidPlugins.setInitMainThreadSchedulerHandler { _ -> scheduler }
        RxJavaPlugins.setComputationSchedulerHandler { scheduler }
        RxJavaPlugins.setIoSchedulerHandler { scheduler }
        RxJavaPlugins.setNewThreadSchedulerHandler { scheduler }
        RxJavaPlugins.setSingleSchedulerHandler { scheduler }
    }

    fun teardown() {
        RxAndroidPlugins.reset()
        RxJavaPlugins.reset()
    }
}

そして、使用します

 companion object {
        @BeforeClass
        @JvmStatic
        fun setup() {
            RxJavaPluginHelper.setup()
        }

        @AfterClass
        @JvmStatic
        fun teardown() {
            RxJavaPluginHelper.teardown()
        }
    }

Android個人的には、この行をプレゼンターから削除するために戦うことはありません。インポートを削除することの背後にある全体的なアイデアPresenterは、さまざまなプラットフォームに移植できるようにすることですが、発生する可能性は低いため、問題ありません。

于 2017-10-05T06:29:57.633 に答える