2012-03-06 40 views
8

tôi thường giao toàn bộ các sự kiện hoạt động để một lớp điều khiển riêng biệt, trong đó có một phương pháp đặc biệt để xử lý các sự kiện từ ActivityDừng Handler nhiệm vụ Runnable khi phá hủy hoạt động

@Override 
public boolean handleMessage(int what, Object data) { 
    switch (what) { 
    case ExerciseViewEvent.STARTUP: 
     workerHandler.post(new Runnable() { 
      public void run() { 
       onStartup(); 
      } 
     }); 
     return true; 
} 

này được thực hiện để giữ thread UI đáp ứng và thực hiện tất cả các tính toán trong các tác vụ nền.

Tuy nhiên, khi phương pháp Activity.onDestroy() được gọi bởi hệ thống, phương pháp controller.dispose() được gọi, mà dọn dẹp tất cả các nội dung trong bộ điều khiển theo cách này

@Override 
protected synchronized void dispose() { 
    ................. 
    if (model != null) { 
     synchronized (model) { 
      model.dispose(); 
     } 
     model = null; 
    } 
    helper = null; 
    ..................... 
    super.dispose(); 
} 

Như bạn thấy, xử lý điều khiển xảy ra trong thread UI, mà không ủy quyền nó cho một chuỗi xử lý.

Vấn đề xảy ra khi nào, ví dụ, onDestroy được gọi là ở giữa onStartup() phương pháp: onDestroy dọn dẹp các mô hình và tất cả các tài liệu tham khảo khác, nhưng bên trong onStartup phương pháp nó cố gắng truy cập vào các mô hình tại một số điểm, nhưng coi đó là null, một ngoại lệ được ném.

Cách tốt nhất để giải quyết vấn đề này là gì? Tôi không muốn khóa tất cả các phương pháp điều khiển bởi vì một số trong số chúng có thể xảy ra đồng thời mà không can thiệp lẫn nhau.

+0

Hơn nữa, có thể phương thức onDestroy không được hệ thống gọi. – Yury

+0

Điểm tốt Yuri, nhưng nếu nó không được gọi, thì tất cả các đối tượng được phân bổ bởi hoạt động này đều bị JVM phá hủy? Vì vậy, tôi không phải lo lắng về nó, phải không? Trong xử lý, tôi chỉ xử lý tất cả các đối tượng, không có gì khác. –

Trả lời

4

Trong phương thức vứt bỏ() bạn nên dọn dẹp nhân viênHandler trước khi vứt bỏ mô hình. Xem các phương thức removeCallbacks hoặc removeCallbacksAndMessage(null) trong lớp Trình xử lý. Phương thức thứ hai loại bỏ tất cả các cuộc gọi lại và tin nhắn khi đối số là null.

+0

workerHandler là loại Handler. Làm thế nào tôi có thể hủy bỏ tất cả các runnables đã được thêm vào Handler này bằng cách sử dụng phương thức post()? –

+0

tôi đã thêm một liên kết trong câu trả lời –

+0

có, nhưng điều này có nghĩa là tôi cần phải theo dõi tất cả các cuộc gọi lại mà tôi thêm vào, nếu không tôi không biết tôi nên xóa những lời gọi lại nào. Không có mehtod như "removeAllCallbacks()" hay cái gì đó. Sau đó tôi sẽ có một danh sách như 'Danh sách ' và lưu trữ tất cả các runnables ở đó. –

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