2012-04-23 11 views
0

私は、携帯電話のWiFi、Bluetooth、モバイルネットワークと対話するアプリケーションを開発しています。 アプリは主にサービスであり、GUIは中心的な役割を果たしません。Android:非同期イベント(インテント)の処理のためのデザインパターン

アプリケーション、およびサービス・クラスの主要メソッドのコアアプリケーションが受信する必要があるすべてのインテントを受信する単一の方法であって

public void handleIntent(Intent intent){ 

次に意図の行動を抽出し、特定の呼び出し例えば、対応する目的のアクションのためのハンドラメソッド、SCREEN_ONを受信したとき、それは

private void handleScreenOn(){ 

を呼ぶような問題は、携帯電話上でいくつかのタスクには時間がかかるということで、いくつかの他のイベントとなるようタスクの処理の途中で発生する可能性があり、処理を変更する必要があります。

例えば、Wi-Fiをオンにするには数秒かかりますが、実際に完了するまでにはWIFI_STATE_CHANGED_ACTIONが送信されます。 WiFiが有効になっている途中で、ユーザーはSCREEN_OFFのインテントを受信するように画面をオフにすることができます。

私のアプリの目標は、画面がオフになったときにWiFiをオフにすることです。問題が発生した状況があります:

  1. 初期状況:画面は、オンでのWiFiがオフの
  2. ユーザーがそれを可能にするための無線LANの設定を切り替えます。無線LANが有効になって
  3. ユーザーを得ることはほとんどすぐにアプリがSCREEN_OFFが意図受信するが、無線LANがまだ有効になっていないので、それはそれ
  4. に有効が終わっます無線LANを無効にする必要がないと考えている、と
  5. オフ画面をオンに開始します画面がオフになっているにもかかわらず、Wi-Fiは有効なままです。

解決方法

現在、ステップ5では、Wifiが有効になったときに、画面がオフになっているかどうかを確認して、Wi-Fiをもう一度オフにします。 この解決策は、すべての可能な場合を処理する多くのif/elseを必要とします。

私は、それを行う意図のスタック、またはこのようなものを扱ういくつかのクリーンな方法がなければならないと確信している...それをきれいに行う方法についていくつかの良いデザインのパターや良いアドバイスと

誰でも?

答えて

1

何らかのイベントへの反応を(非同期的に)完了するたびに、「アクション完了」イベントを送信することを検討してください。今度は、handleIntent()にいくつかのロジックを追加して、一貫した状態を達成することができます。ロジックはコンポーネントの中心にあり、コードの重複は避けられます。

また、イベントをシリアル化しようとすることもできます。つまり、まだ完了していないアクションの結果を無効にするイベントが発生した場合(完了していないアクションのリストを管理する必要がある場合。それらのすべてのアクションが完了するまでのその処理。どのイベントが他のイベントに依存するかを判断するには、単純で静的なルックアップテーブルで十分です。

0

もう1つの方法は、管理対象のエンティティ(すべてのエンティティまたは非同期エンティティ)の状態を維持することです。非同期の場合、状態はバイナリ(ON | OFF)ではなく、ON、TURNING_ON、OFF、TURNING_OFFの少なくとも3つまたは4つの状態を持つ必要があります。次に、手順4でSCREEN_OFFを受け取ったら、WIFI状態をONまたはTURNING_ONで確認して、オフにする必要があるかどうかを判断します。

関連する問題