2017-08-16 5 views
0

これは特定のものではなく一般的な質問です。Android Bleクライアントアプリのアーキテクチャ

私は基本的にBle周辺機器と通信するAndroidアプリを開発しています。 RxAndroidBleライブラリを使用してBle通信を処理します。一般的なパターンに関しては、Mosby MVIを試してみることにしましたが、それほど重要でないのは です。

私がこれまで行ったことは、Bleデバイス上ですべての操作 を実行する役割を担うBluetoothManagerクラスを作成したことです。このクラスはシングルトンです(Androidではお勧めできません)、Daggerを使ってスコープを設定しました。 これはBle通信を実行するインタラクタにのみ注入されます。 このクラスはObservablesをいくつかのPOJOとともに返します。これらのPOJOは、インタラクタのViewStatesに変換され、UIの上位に移動されます。 サブスクリプションは、Mosby MVIパターンに従う発表者にあります。

基本的に、私はこのBle Deviceを通常のデータソースとして扱いました。これは、改造サービスやdbと同じです。 それは、私がいくつかの単一の特徴を書いたり読んだりするような原子操作を実行していれば、まったく問題ありませんでした。

問題は、かなりの時間がかかり、バックグラウンドで実行する必要がある同期を起動する必要があるときです。 はUIにバインドしないでください。ただし、一部の画面ではユーザーは進行状況を参照してください。 ここで私はAndroidサービスを使ってBle Communicationロジックを実装することを考え始めましたが、 私の意見では、Androidサービスを使用するとロジック分離の試みが壊れてしまい、そこに適合する良い方法が見つけられませんでした。

第3のオプションは、UIにバインドされたアトミック操作のためにBluetoothManagerを同期化して保存するサービスを持っていましたが、 私はそれが面倒だと思っています。

私は長いですが、すべてが1つの質問に行くことを知っています - > のBleデバイスと通信する際には、レイヤの分離を保ち、可能な限り独立した状態に保つために、 Rxアプローチを使用していないものがある場合は、それを処理するための良い記事が見つかりませんでした。 あまりにも一般的な場合は、詳細をいくつか指定できますが、コードスニペットではなくアーキテクチャ上のアドバイスを探しています。

答えて

0

このようなものについてはどう:直接ブルートゥースする の代わりに、プレゼンターに加入し、その後BleRepositoryを実行するためにmetod Observable<Foo>(fooはあなたのプレゼンター/ UIが表示されるはずですどんなデータである)と操作を提供BleRepository

クラスを導入doA()のようなもの。このような何か:

interface BleRepository { 


    // Read Data 
    Observable<Foo> getDataObservable(); 

    // Write Data operations 
    Completable doA(); 
    Completable doB(); 

} 

だからプレゼンターではなく、直接のBluetooth接続に BleRepositoryに加入しています。

これで、「書き込み操作」を実行するだけで、それを実行するだけですが、書き込み操作自体が新しいデータを返す場合でも常に新しいデータをgetDataObservable()から読み込みます。読み取りデータは常にgetDataObservable()です。

したがってBleRepositoryは、プレゼンターが使用する基本的な単なる公開APIです。プレゼンターは、実際のBluetooth接続については認識していません。あなたが次に行うことができるのは、実際のBluetooth接続をAndroidサービスに移すことです。BluetoothServiceと呼ぶことができます。その後、BluetoothServiceゲットが接続され、同期が実行されるか、接続が送受信するものがあれば、そのデータがサービスによってサブスクライブされているBleRepository.getDataObservable()に返されます。サービスとプレゼンターの両方が同じBleRepositoryインスタンスを「共有」していることを確認してください。つまり、同じインスタンスを挿入したり、シングルトンにしたりするために短剣を使用してください...あなたにとって最適なものは何でも。

あなたのユースケースに応じて、BluetoothServiceサブスクリプションをRxJavas onSubscribeのアンドロイドサービスを開始するように認識させ、unsubscribe/onTerminalでサービスを停止することもできます。しかし、あなたのユースケースは少し違っているので、プレゼンター/ビューが破棄されていてもBluetoothがまだ接続されているように聞こえますか?どのようなものであれ、そのアイデアはService(あなたのprobleに合っていればサービス)ですが、彼らは何とかデータをBleRepositoryにプッシュしてからデータをPresenterに配信します。

+0

お返事ありがとうございます!私は[ここ](https://stackoverflow.com/questions/43042785/android-mosby-mvi-bind-to-service-in-presenter?rq=1)からあなたの以前の応答に合うように努めていたが、私はそれをかなり見つけた難しいこのDataObservableとして何を使用しますか?いくつかのBehaviourSubjectと私はそれがデバイスからいくつかの価値を得るたびにonNextを発射するだろうか?また、複数のdataObservablesについては、デバイスにかなりの読み書きをすることができますが、それらのすべてをあるタイプのオブジェクトに簡単にマッピングできるわけではありません。 – Jogosb

+0

この回答は、あなたが確かに必要としない縛られたサービスにありました! これは、複数のデータ観測値よりも簡単に行うことができます。私はたいてい1つだけ好きですが、それはデータに依存しており、あなたが何をしているのか分かりません。 BehaviorSubjectの代わりにPublishRelayを見てください。 – sockeqwe

関連する問題