2017-10-03 12 views
3

当社の製品用のパブリックSDKを構築しています。これはKotlinで構築され、内部的にはコルーチンを使用しています。しかし、JAVA形式で使用できるAPIを公開したいので、公開APIとして一時停止可能な機能を提供できません。独自のSDKのアーキテクチャ - Kotlinの非同期メソッドAPI

Javaの使い勝手がKotlinよりも快適でない場合は、大丈夫です。かなり期待しています。

ので、例えば、私たちは以下の非同期メソッドの戻り値の型を探しています:

  1. をインターフェースとしてRX Javaの使用:私たちが考えた

    class Sdk { 
        fun getPlace(): ___ 
    } 
    

    物事。私たちはこの解決策が嫌いです、Rxは非常に複雑で、できるだけ他の依存関係を追加したいと思っています。一般的に、私たちはSingleを返して行くだろう。しかし、Rxは私たちが解決したくないもの(スレッドは作業が終わっているはずです)とRxは解決したいことを(できれば)解決しません。ライフサイクル&オブザーバー - Androidアーキテクチャのコンポーネントで解決されるもの。

  2. Java 8 Future。これは最も適切だが、古いAndroids(少なくとも4.1)を対象にする必要があるため不可能であると思われる。

  3. AndroidアーキテクチャLiveData。 LiveDataを返すことはOKですが、observeForever()メソッドもあり、バックグラウンドスレッドで使用できるようになります。一方、apiは、繰り返して複数の結果を返す可能性があることを示唆しています。しかし、私たちは間違いなく結果または1つの例外のみを省略したい。しかし、Kotlinでは、拡張機能を実装して、sdk.getPlace().await()として利用できるようにしています。

  4. カスタムソリューション:単純なResultオブジェクトを返します。コールバックを提供することで結果をサブクレイブすることができます。sdk.getPlace().observe(Observe { onSucccess(data: Place) {} onFailure(e: Throwable) {} });待つための拡張機能を提供します。

質問:

我々はいくつかの重要な側面/ライブラリ/可能性を欠場
  1. 私たちはどのソリューションを選択すべきか、その理由は何か。
+0

[google/guava](https://github.com/google/guava)をご覧ください。それはいくつかのJava機能のポートを元のJavaバージョンに戻します。 – Joshua

+0

Googleサービスの「タスク」についてはどうですか? Kotlinではラムダを使うこともできますし、単に 'task.getResult()' https://developers.google.com/android/reference/com/google/android/gms/tasks/Task –

答えて

3

この質問に具体的な回答があるかどうかはわかりません。だから次のすべては私の意見です。あなたは同意するか同意しないかのどちらかになります。 OPが尋ねたことを達成するには、さまざまな方法があります。

個人的には、RxやアーキテクチャコンポーネントとLiveDataの依存関係は含まれません。多くの最新のアプリケーションではこれらの依存関係が使用されていますが、SDKにサードパーティの依存関係がたくさんあることはお勧めできません。他の開発者がそれらを無効にして、予期しない結果につながる可能性があります。

私は2つのソリューションを参照してください。

  1. あなたがこの方法以外非同期にすると、クライアントがそれらを使用する方法を見つけ出すせることができますかどうかを自問してみてください。あまりユーザーフレンドリーではないように思えるかもしれませんが、開発者は、おそらくSDKコールバックの周りに独自の非同期ラッパーがあることを知っています。
  2. カスタムコールバックを使用します。これはAndroidの世界でパブリックAPIを提供するための非常に簡単で一般的な方法です。他の開発者がRxを使用している場合、これらのメソッドをラップしてストリームに従う方法を知っています。 LiveDataユーザーも同様です。

私があなただったら、Java/Kotlinユーザー向けにさまざまなAPIメソッドを公開することも考えています。 Kotlinユーザーは、よりクリーンな方法を提供してくれてありがとう。 coroutinesを呼び出して、SDKのメソッドを呼び出します。

+0

あなたの提案に感謝します。 コールバックを使用する方法とkotlinのサスペンドを使用する方法の2つの方法を試しました。しかし、これは時間の経過とともにかなり乱雑になりました。 現在のところ、すべてを同期として実装しており、コードがUIスレッドで実行されるときに例外がスローされます。 – hrach

+0

それは混乱に終わったと申し訳なく思っています。まあ、少なくともあなたたちはそれがうまくいかないことを知っています:)私はあなたの経験を分かち合う価値があると思います。あなた自身の質問に答えてもらえますか?他の開発者にとっては面白いと思う。 –

関連する問題