0

私は携帯電話のWiFi、Bluetooth、モバイルネットワークと相互作用するアプリを開発しています。アプリは主にサービスであり、GUIは中心的な役割を果たしません。

アプリのコアであり、サービスクラスの主要なメソッドは、アプリが受け取る必要のあるすべてのインテントを受け取る単一のメソッドです。

public void handleIntent(Intent intent){

次に、インテントのアクションを抽出し、対応するインテントのアクションに対して特定のハンドラーメソッドを呼び出します。たとえば、SCREEN_ONを受信すると、

private void handleScreenOn(){

問題は、電話の一部のタスクに時間がかかるため、タスクの処理中に他のイベントが発生し、処理が変更される可能性があることです。

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

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

  1. 初期状態:画面がオン、WiFiがオフ
  2. ユーザーがWiFi設定を切り替えて有効にします。Wifiが有効になり始めます
  3. ユーザーはほとんどすぐに画面をオフにします
  4. アプリはSCREEN_OFFインテントを受け取りますが、WiFiはまだ有効になっていないため、無効にする必要はないと考えています。
  5. Wifiの有効化が終了し、画面がオフになっていてもWifiは有効のままになります。

それを解決する方法は?

現在、ステップ5で、Wi-Fiが最終的に有効になったときに、画面がオフになっているかどうかをテストして、Wi-Fiを再びオフにします。このソリューションでは、考えられるすべてのケースを処理するために多くのif/elseが必要です。

それを行うためのよりクリーンな方法、インテントのスタックの処理、またはこのようなものが必要だと確信しています...

良いデザインパターンやそれをきれいに行う方法についての良いアドバイスを持っている人はいますか?

4

2 に答える 2

1

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

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

于 2012-04-23T14:11:28.517 に答える
0

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

于 2012-04-23T14:29:49.003 に答える