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:
- gewährleisten BT aktiviert (
startActivityForResult()
mit BT Absicht aktivieren, wenn nicht) - an das entfernte Gerät verbinden
- eine Funktion der Remote-Gerät aktivieren
- 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)?
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