2015-01-15 31 views
8

Chương trình được đề cập, khi chạy trên Android, điều khiển các thiết bị Bluetooth (BT) nô lệ. Nó có vài nút cho phép các chức năng khác nhau của các thiết bị ngang hàng.Điều khiển luồng chương trình Android khi có lệnh startActivityForResult

Bluetooth không được bật theo mặc định trên thiết bị Android và kết nối được thiết lập trong khoảng thời gian ngắn sau khi nhấp vào nút.

Vì vậy, dòng chảy sau mỗi nút nhấp chuột là:

  1. đảm bảo BT kích hoạt (startActivityForResult() với BT cho phép ý định nếu không muốn nói)
  2. kết nối với các thiết bị từ xa
  3. cho phép một số chức năng của thiết bị từ xa
  4. ngắt kết nối khỏi thiết bị

Vấn đề của tôi là nếu BT không được bật, thì ca ll để startActivityForResult() trong # 1 "phá vỡ" luồng chương trình. Sau đó, khi onActivityResult() được gọi, tôi muốn tiếp tục luồng từ điểm bị "ngắt".

Vì mục đích đó tôi xác định lĩnh vực thành viên bổ sung và vài hằng số và sử dụng chúng trong 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; 
    } 
} 

Bây giờ, thêm một biến chứng: onActivityResult() sẽ được gọi trước khi hoạt động của onResume(). Điều này sẽ quan trọng nếu có bất kỳ yêu cầu nào trong số methodX() cần phải thay đổi hệ thống phân cấp lượt xem. Trong trường hợp của tôi, các phương thức này thay thế một số Fragments và nếu hoạt động này được thực hiện từ onActivityResult() thì ngoại lệ sẽ được ném.

Để giải quyết vấn đề bổ sung này, số switch xấu xí từ onActivityResult() di chuyển sang onPostResume().

Phương pháp mô tả ở trên tác phẩm, nhưng nó là một trong những phần xấu nhất của mã mà tôi từng viết: methodX() "đăng ký" bản thân cho "chạy lại" bằng cách gán RERUN_METHOD_X liên tục để mRerunMethodIndex, onActivityResults() bộ một số "liên tục ngập tràn cờ" sau BT được bật, onPostResume() kiểm tra cờ, xóa cờ này, xóa mRerunMethodIndex và chạy lại thích hợp methodX().

Có cách tiếp cận trang nhã hơn (tốt nhất là giới hạn ở 1 hoặc 2 phương pháp) không?

Trả lời

3

Bạn có thể sử dụng runnable để tổ chức quy trình làm việc của mình mà không cần sử dụng các hằng số bước. Ví dụ:

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

Dường như một số biến thể của mẫu thiết kế Command. Tôi không hoàn toàn chắc chắn rằng cách tiếp cận này sẽ đơn giản hóa mã, nhưng nó thực sự là một thú vị. Tôi sẽ cố gắng xem nó hoạt động như thế nào vào lần tới khi tôi bước vào tình huống này. – Vasiliy

Các vấn đề liên quan