2015-01-15 2 views
8

문제의 프로그램이 Android에서 실행될 때 슬레이브 Bluetooth (BT) 장치를 제어합니다. 피어 장치의 다양한 기능을 사용할 수있는 버튼이 거의 없습니다.startActivityForResult 호출이있는 상태에서 Android 프로그램 흐름 제어

Android 기기에서는 기본적으로 블루투스가 사용 설정되지 않으며 버튼을 클릭하면 짧은 시간 동안 연결이 설정됩니다.

그래서, 각 버튼을 클릭 한 후 흐름은 :

  • 원격 장치
  • 연결

    1. 원격 디바이스의 일부 기능을 활성화 (그렇지 않으면 의도 있도록 BT와 startActivityForResult())를 BT 활성화 확보 장치에서
    2. 분리

    내 문제는 그 BT가 활성화되지 않은 경우, 다음, CA # 1의 startActivityForResult()은 프로그램 흐름을 "중단"합니다. 나중에 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() 전에 호출됩니다. methodX() 중 하나가 뷰 계층 구조를 변경해야하는 경우 중요합니다. 필자의 경우 이러한 메서드는 일부 Fragments를 대체하며이 작업을 onActivityResult()에서 실행하면 예외가 throw됩니다.

    이 추가 문제를 해결하려면 switchonActivityResult()에서 onPostResume()으로 마이그레이션됩니다.

    작품 위에서 설명한 방법하지만 내가 작성한 코드의 추악한 부분 중 하나입니다 후 RERUN_METHOD_X 일정 mRerunMethodIndex에, onActivityResults() 세트의 일부 "다시 실행 플래그"를 지정하여 "다시 실행"에 대한 methodX() "등록"자체 BT가 활성화되면 onPostResume()이 플래그를 확인하고이 플래그를 지우고 mRerunMethodIndex을 지우고 해당 methodX()을 다시 실행합니다.

    좀 더 우아한 방법이 있습니까? (1 또는 2 가지 방법으로 제한되는 것이 바람직합니까?)

  • 답변

    3

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

    명령 디자인 패턴의 변형입니다. 나는이 접근법이 코드를 단순화 할 것이라고는 확신 할 수 없지만 실제로 흥미로운 것입니다. 나는 다음 번에 내가이 상황에 어떻게 작용하는지 보려고 노력할 것이다. – Vasiliy