非同期コード補完ブロックを頻繁に使用するAPIを設計しています。UIスレッドのコールバック用OPTIONALLYデザインパターン
public interface IResult<T extends Result.I> {
void onResult(T);
}
public void doXYZ(IResult<Result.TypeA> iResult) { ... }
ユーザーは、私のAPIのdoXYZ()を呼び出してしまうと、別のネットワークワーカースレッドが後でiResult.onResult()を呼び出します。時には彼はonResult()が呼び出されたスレッドを気にしません。UIを更新するだけの場合もあります。ユーザーの負担を軽減し、匿名の内部クラスをきれいに保つことができます。小さい。
このAPIはAndroid用で、多くの場合(すべてではありません)、UI要素に影響を与えるonResult()コールバックで何か操作を行い、コードがUIスレッド上で実行されることが必要な場合があります。 runOnUIThread(...)の呼び出しでコードをダーティにすることをユーザーに負わせるのではなく、doXYZ()の呼び出し時に、 UIスレッドでコールバックを呼び出すかどうかを指定します。
パフォーマンス上の理由から、私のAPIが常にUIスレッドでonResult()を呼び出さないようにしたいと思います。
私が見た1つのパターンは、doXYZ(...、boolean callOnUIThread)メソッドパラメータを追加することです。しかし、APIが文書化されているので、私はむしろそれらの追加のブール値をすべて持つことによって、ドキュメンテーション(およびメソッドシグネチャ)を汚してはいけません。
別の考えでは、各doXYZ()がcallOnUIThreadパラメータのあるものと1つを持つようにオーバーロードされていましたが、膨大なためにドキュメント化に非常に悪いです。
もう1つは、onResult()メソッドにonResult()に加えてonResultUI()メソッドを追加することでしたが、ユーザーのコードを匿名クラスで常に定義する必要があるため、
これを達成するためのクリーンな方法の提案は、次のとおりです。 i。簡潔 ii。コードの可読性には最適 iii。文書化が容易 ?
は使用コードについて考えてみます:コードは、GUIスレッド上で実行する必要がある場合は、 'IResult'インスタンスを作成した時点で知っていますか?その場合、GUIインターフェース 'IRunsOnGui'を提供することができます。これは、クライアントが' onResult'をGUIスレッド上で実行したい場合に拡張することができます。あなたが 'IResults'を追加するとき、それが' IRunsOnGui'のインスタンスであるかどうかをチェックし、その結果がGUIスレッド上でのみ実行できるようにします。これの一例は[ここのideone](http://ideone.com/whEDB2)で見ることができます。これがあなたの質問に答えるなら、私は答えに入れてうれしいです。 – BeyelerStudios
したがって、基本的に 'doXYZ'はインタフェースを介して結果を報告する非同期ジョブをディスパッチしています。この場合、マーカとデコレータの両方が適しています(私の[ideone-link](http://ideone.com/whEDB2)で見るように組み合わせることもできます):例では、Foremanボブはディスパッチを行います、 'bob.dirve 'あなたの' doXYZ 'になるでしょう)。あなたが好きなものを選んでください。「IResult」を装飾するか、別の方法で動くようにマーキングすることで、呼び出し先にコントロールを与えます。 'doXYZ'では、あなたの一般的な作業者のプールに送ってもらうか、GUIスレッドに送るかをチェックしてください。 – BeyelerStudios