2013-06-17 18 views
7

Tôi có một dịch vụ nhận lệnh từ Internet và khởi chạy một chuỗi nền. Chủ đề này được chuyển qua một trình xử lý từ dịch vụ (dịch vụ được giới hạn và thông qua trình xử lý) và gửi một thông báo tới trình xử lý để chụp ảnh. Tôi bị mắc kẹt về việc thực hiện xử lý.Android: Cách sử dụng trình xử lý HandlerMessage và truy cập tham chiếu đến MainActivity

static Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      //TODO: Handle different types of messages 
      mCamera.takePicture(null, null, MainActivity.this); 
     } 
}; 

Câu hỏi:

  • Liệu Handler cần phải tĩnh? Không có tĩnh, tôi nhận được "Lớp Trình xử lý này phải là tĩnh hoặc rò rỉ có thể xảy ra"
  • MCamera có cần tĩnh không? Tôi đã nói để làm cho mCamera tĩnh, nhưng tại sao điều này là cần thiết? Có cách nào để thiết lập takePicture mà không làm cho mCamera tĩnh?
  • Cách thích hợp để chuyển tham chiếu đến MainActivity là gì? Ngay bây giờ tôi nhận được lỗi: "Không có ví dụ kèm theo của các loại MainActivity có thể truy cập trong phạm vi"
+0

Có một cái nhìn ở đây: http://stackoverflow.com/a/16071874/2359488 –

Trả lời

9

Bạn có thể tạo một lớp (Hoạt động/Dịch vụ) thực hiện Handler.Callback và tạo ra một Handler mới cho nó qua new Handler(this).

+0

Điều này đã làm các trick vì nó đơn giản hóa rất nhiều chi phí (tôi không phải vượt qua đối tượng, vv) so với các phương pháp khác được mô tả trong bài đăng này. – Rich

0

Bạn có thể sử dụng Message thành viên obj và chuyển đối tượng mong muốn cho trình xử lý.

static Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      //TODO: Handle different types of messages 
      //TODO: handle cast exception 
      final MainActivity activity = (MainActivity) msg.obj; 
      final Camera camera = activity.getCamera(); 
      camera.takePicture(null, null, activity); 
     } 
}; 
2

Bạn có thể thay đổi mã của bạn như sau:

static Handler handler = new Handler() { 

      MainActivity mActivity; 

      @Override 
      public void handleMessage(Message msg) { 
       //TODO: Handle different types of messages 
       if(mActivity != null) { 
        mActivity.mCamera.takePicture(null, null, mActivity); 
       } 
      } 
    }; 

    void MainActivity::onCreate(Bundle savedState) { 
     ... 
     handler.mActivity = this; 
    } 

    void MainActivity::onDestroy() { 
     ... 
     handler.mActivity = null; 
    }  
Các vấn đề liên quan