2017-10-04 5 views
1

。しかしRxJavaでアンドロイドでクリーンなMVPを使用する:UIスレッドを見ながら、どのようにアンドロイドの知識がなくても、プレゼンターにはどのようにしておくことができますか?プラグインとしてアンドロイドフレームワークを扱い、プレゼンター層に任意のアンドロイド意識の依存関係を漏れないように助言されたMVPパターンをAndroid上で「クリーン」アーキテクチャを実装するための努力において

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()」にこの力を観察することによって、:私は私はこのようなロジックを持ちたいかもしれビュー層に「プッシュ」のデータに設計されてプレゼンターを持っている場合、rxjavaを使用して依存関係:

import io.reactivex.android.schedulers.AndroidSchedulers 

この時点で私の発表者はアンドロイドを知っています。私は避けたいものです。

プレゼンターがアンドロイド関連のものに依存しない状態で、結果がアンドロイドのUI(メイン)スレッド上のViewLayerに配信されることを保証するためのアドバイスされた方法はありますか?

+0

たぶんViewLayerインタフェースは '観測getThread()のようないくつかの方法が必要ですか;'? – 0X0nosugar

答えて

1

AndroidSchedulers.mainThread()は、メインスレッドでアクションをスケジュールするためにAndroidコードを使用します。プレゼンターで直接使用しないでください。 代わりに、プレゼンターがそのコンストラクタでスケジューラを取得するようにリファクタリングすることができます。プロダクションコードではAndroidSchedulers.mainThread()Schedulers.io()を使用し、テストではSchedulers.trampoline()またはSchedulers.immediate()を送信できます。

この例では、このパターンを参照してください。前の回答で指摘したように、あなたがPresenterのコンストラクタでSchedulerを注入することができますが、少なくとも2つの可能性がある https://github.com/riggaroo/GithubUsersSearchApp/blob/8b83095d7a2cc8f3cb69a945224ab4c37cf54a37/app/src/test/java/za/co/riggaroo/gus/presentation/search/UserSearchPresenterTest.java

+0

もちろん。正確に私は行方不明だった。 – JohnRock

0

:ここhttps://github.com/riggaroo/GithubUsersSearchApp/blob/master/app/src/main/java/za/co/riggaroo/gus/presentation/search/UserSearchPresenter.java

とそのテストクラスを。

  1. あなたはinteractorに直接Schedulerを注入することができ、その後、あなたはpresenterで任意の操作を行う必要はありません。その後、テストではinteractorを模倣し、テストではrxjavaの依存関係を完全に忘れることができます。

  2. RxJavaPluginsRxAndroidPluginsを使用すると、インタラクターにAndroidSchedulersを残しても問題ないと思ったら、テストでスケジューラーをオーバーライドすることができます。

ので(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() 
    } 
} 

そして個人的に私はからAndroid輸入を取り除く全体の考え方として、プレゼンターからこの行を削除するために戦わないでしょう

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

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

を使用Presenterは異なるプラットフォームに移植可能にすることですが、起こりそうにないので、私はそれをokと見なします。

関連する問題