Управление потоком программ Android в присутствии вызова startActivityForResult

Программа, о которой идет речь, при запуске на Android, управляет подчиненными устройствами Bluetooth (BT). Он имеет несколько кнопок, которые позволяют выполнять разные функции одноранговых устройств.

Bluetooth не включен по умолчанию на устройстве Android, и соединение устанавливается на короткие промежутки времени после нажатия кнопки (ов).

Итак, поток после каждого нажатия кнопки:

  1. Убедитесь, что BT включен ( startActivityForResult() с поддержкой BT, если нет)
  2. Подключиться к удаленному устройству
  3. Включить некоторые функции удаленного устройства
  4. Отсоединить от устройства

Моя проблема в том, что если BT не включен, тогда вызов startActivityForResult() в # 1 «ломает» поток программы. Позже, когда onActivityResult() , я хочу возобновить поток с того места, где оно было «сломано».

Для этого я определил дополнительное поле члена и несколько констант и использовал их в 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; } } 

Теперь еще одно осложнение: onActivityResult() будет onResume() до операции onResume() . Это будет иметь значение, если какой-либо из methodX() должен изменить иерархию представлений. В моем случае эти методы заменяют некоторые фрагменты, и если эта операция выполняется из onActivityResult() то onActivityResult() исключение.

Чтобы решить эту дополнительную проблему, уродливый switch onActivityResult() переносится на onPostResume() .

Описанный выше подход работает, но это один из самых уродливых фрагментов кода, который я когда-либо писал: methodX() «регистрирует» себя для «повторного RERUN_METHOD_X », назначая константу mRerunMethodIndex , onActivityResults() устанавливает некоторый «флаг повтора» после BT включен, onPostResume() проверяет флаг, очищает этот флаг, очищает mRerunMethodIndex и повторно methodX() соответствующий methodX() .

Существует ли более элегантный подход (предпочтительно ограниченный 1 или 2 способами)?

Solutions Collecting From Web of "Управление потоком программ Android в присутствии вызова startActivityForResult"

Вы можете использовать runnable для организации вашего рабочего процесса без использования степенных констант. Например:

 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; } }