2015-01-15 13 views
8

Das Programm in Frage, wenn auf Android ausgeführt wird, steuert Slave Bluetooth (BT) -Geräte. Es hat wenige Tasten, die verschiedene Funktionen der Peer-Geräte ermöglichen.Android Programmflusskontrolle in Anwesenheit von startActivityForResult Anruf

Bluetooth ist auf dem Android-Gerät nicht standardmäßig aktiviert und die Verbindung wird nach dem Klicken auf die Schaltfläche (n) für kurze Zeit hergestellt.

So wird die Strömung nach jedem Tastenklick ist:

  1. gewährleisten BT aktiviert (startActivityForResult() mit BT Absicht aktivieren, wenn nicht)
  2. an das entfernte Gerät verbinden
  3. eine Funktion der Remote-Gerät aktivieren
  4. trennen von dem Gerät

Mein Problem ist, dass, wenn BT nicht aktiviert ist, dann wird ein ca ll bis startActivityForResult() in # 1 "bricht" den Programmablauf. Später, wenn aufgerufen wird, möchte ich den Fluss von dem Punkt fortsetzen, wo es "gebrochen" wurde.

Zu diesem Zweck I definiert zusätzliches Mitglied Feld und einige Konstanten und verwendet sie in onActivityResult():

private int mRerunMethodIndex = 0; 
private static final int RERUN_METHOD1 = 1; 
private static final inr RERUN_METHOD2 = 2; 
... 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
     case REQUEST_ENABLE_BT: 
      if (resultCode == Activity.RESULT_OK) { 
       int rerunMethodIndex = mRerunMethodIndex; 
       mRerunMethodIndex = 0; 
       switch (rerunMethodIndex) { 
        case (RERUN_METHOD1): 
         method1(); 
         break; 
        case (RERUN_METHOD2): 
         method2(); 
         break; 
        // ... the same for other cases 
       } 
      } 
      break;  
     default: 
      break; 
    } 
} 

, nun eine weitere Komplikation: onActivityResult() wird onResume() vor Aktivität des genannt werden. Dies ist wichtig, wenn einer der methodX() die Sichtenhierarchie ändern muss. In meinem Fall ersetzen diese Methoden einige Fragmente, und wenn diese Operation von onActivityResult() ausgeführt wird, wird eine Ausnahme ausgelöst.

Um dieses zusätzliche Problem zu beheben, migriert die hässliche switch von onActivityResult() zu onPostResume().

Der Ansatz oben genannten Arbeiten beschrieben, aber es ist eines der hässlichsten Stücke von Code, den ich je geschrieben habe: methodX() „Register“ selbst für „Wiederholung“ von RERUN_METHOD_X konstant mRerunMethodIndex, die Zuordnung nach onActivityResults() Sätzen einige „Rerun flag“ BT ist aktiviert, onPostResume() prüft das Flag, löscht dieses Flag, löscht und führt das entsprechende methodX() erneut aus.

Gibt es einen eleganteren Ansatz (vorzugsweise auf 1 oder 2 Methoden beschränkt)?

Antwort

3

Sie könnten Runnable verwenden, um Ihren Arbeitsablauf ohne Verwendung von Schrittkonstanten zu organisieren. Zum Beispiel:

public void Runnable mMethod1 = new Runnable() { 
    public void run() { 
     // your code for method 1 
    } 
} 

public void Runnable mMethod2 = new Runnable() { 
    public void run() { 
     // your code for method 2 
    } 
} 

public void Runnable mMethod3 = new Runnable() { 
    public void run() { 
     // your code for method 3 
    } 
} 

private void startMethod(Runnable method) { 
    mCurrentMethod = method; 
    method.run(); 
} 

... 

public vond onPostResume() { 
    if (mCurrentMethod != null) { 
     mCurrentMethod.run(); 
     mCurrentMethod = null; 
    } 
} 
+0

Sieht aus wie eine Variation des Befehlsdesignmusters. Ich bin mir nicht ganz sicher, ob dieser Ansatz den Code vereinfachen wird, aber er ist in der Tat interessant. Ich werde versuchen zu sehen, wie es beim nächsten Mal in dieser Situation funktioniert. – Vasiliy

Verwandte Themen