2010-08-26 45 views
14

Tôi không hiểu tại sao tôi nhận được ngoại lệ này khi nhấn nút quay lại. Tôi đã đăng ký IntentReceiver trong phương thức onCreate và nó được cho là không được đăng ký trong phương thức onPause. Log.w() của tôi gọi bên trong của phương thức onPause dẫn tôi tin rằng phương thức unregisterReceiver() đang được gọi, nhưng tôi vẫn nhận được ngoại lệ này.Android: Rò rỉ IntentReceiver ngoại lệ đang được ném ngay cả khi tôi gọi unregisterReceiver

Mọi suy nghĩ?

private PlayerReceiver playerReceiver; 

public void onCreate(Bundle savedInstanceState) { 
... 
    IntentFilter playerFilter;  
    playerReceiver = new PlayerReceiver(); 
    playerFilter = new IntentFilter(PlayerService.BUFFERING_FAILURE); 
    playerFilter.addAction(PlayerService.BUFFERING_SUCCESS); 
    registerReceiver(playerReceiver, playerFilter); 
... 
} 

protected void onPause() { 
... 
    if (playerReceiver != null){ 
     unregisterReceiver(playerReceiver); 
     Log.w(TAG, "playerReceiver has been unregistered"); 
     playerReceiver = null; 
    } 
... 
} 

public class PlayerReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(PlayerService.BUFFERING_FAILURE)){ 
      setListenButton(false); 
     } 
     closePlayDialog(); 
    } 
} 

LogCat Output

08-26 11:44:28.646: WARN/WWOZMain(1058): playerReceiver has been unregistered  
08-26 11:44:29.476: ERROR/ActivityThread(1058): Activity org.wwoz.WWOZMain has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()?  
08-26 11:44:29.476: ERROR/ActivityThread(1058): android.app.IntentReceiverLeaked: Activity org.wwoz.WWOZMain has leaked IntentReceiver org.wwo[email protected] that was original 

ly đăng ký ở đây. Bạn có bỏ lỡ cuộc gọi đến unregisterReceiver() không?

+4

Thông thường bạn nên đăng ký trong 'onResume' và hủy đăng ký trong' onPause' (hoặc 'onStart' và' onStop'). Vì vậy, có thể bạn không đăng ký nhiều lần mà không đăng ký lại khi hoạt động tiếp tục. Có vẻ như ngược lại với vấn đề bạn đang gặp phải, nhưng tôi đoán nó vẫn có thể kích hoạt cảnh báo nhật ký tương tự đó? –

+0

Argh! Cảm ơn Christopher. Tôi thậm chí không chú ý đến thực tế là tôi đã đăng ký người nhận trong cả hai 'onCreate' và' onResume'. Vì vậy, thay vào đó, tôi đã đăng ký hai lần và chỉ hủy đăng ký một lần. Doh! –

Trả lời

20

Đây là vấn đề về vòng đời hoạt động của Android. Tôi nhìn thấy nó trong một hoạt động chính và sau đó thử nghiệm trên thiết bị với nút quay trở lại màn hình giật gân.

Trong phương thức onPause().

Unregister các BroadcastReceiver mà bạn đã tạo trong onCreate()

Trong onRestart() tái đăng ký một thương hiệu mới Broadcast Receiver.

Trong lớp hoạt động, bạn cần lưu bản ghi của Broadcast Receiver làm thành viên dữ liệu mẫu.

THỨ HAI

Tôi nghĩ rằng đây cũng là một vấn đề tính năng nâng cao với Android.

Đôi khi, nhà phát triển cần có bộ thu phát sóng để phát hành hoạt động. Ví dụ để hiểu khi nào một số trạng thái màn hình nhất định có sẵn hay không. Hãy suy nghĩ về một bối cảnh hội thoại của mô hình luồng công việc, có nhiều trạng thái.

BA

Bạn có thể đăng ký và unregister thu phát sóng với một hoạt động, nhưng một cuộc gọi đơn giản như isRegistered(BroadcastReceiver) trong lớp Hoạt động có thể rất hữu ích.

Nếu bạn cần người nhận sống ngoài hoạt động, thì tôi không trả lời, ngoại trừ để tắt tiếng cảnh báo, bằng cách thêm unregister(X) vào cuộc gọi onDestroy(). YMMV ;-)

8

Tôi gặp vấn đề tương tự. Nguyên nhân là tôi đã vô tình đăng ký cùng một BroadcastReceiver hai lần.

3

Tình huống của tôi tương tự với Mullins, tôi đã đăng ký người nhận trong cả lớp và lớp con của nó.

Đối với những người mới thích như tôi, chỉ cần chuyển đổi điểm ngắt tại số receiver của bạn, sau đó gỡ lỗi ứng dụng của bạn. Nếu người nhận là một cái gì đó như [email protected], trong khi nhật ký lỗi trong logcat khác với nó, chẳng hạn như [email protected], với các ký tự sau "@" khác nhau, chắc chắn bạn đã đăng ký nó hai lần (hoặc nhiều hơn).

(Ở trên thích nhận xét dưới câu trả lời của Mullins, thực sự, tôi đăng bài ở đây vì tôi không thể đăng nhận xét ngay bây giờ.)

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