java.lang.IllegalArgumentException: Receiver not registered


錯誤提示:java.lang.IllegalArgumentException: Receiver not registered。

顧名思義就是Receiver沒有被注冊,這是由於取消了沒有注冊的Receiver導致的錯誤。

我們使用Receiver時必須保證注冊(register)和反注冊(unregister)成對出現。

遇到這種問題時,你需要檢查下自己代碼中注冊和反注冊的代碼,看下是否存在多次調用unregister的時候。

很多時候都是想當然認為會那樣,但是程序中可能有我們未預料的出口,比如我的程序中在onCreate注冊,finish取消注冊,理論進入、退出時應該成對出現,但實際報錯了!分析到最后是原布局中使用了TabActivity、GroupActivity等多種結構嵌套,退出當前Activity時,finish方法被執行了多次。

所以建議Receiver注冊和反注冊的過程放到onResume和onPause過程中,兩個理由:

(1)這兩個過程肯定會成對出現,因此可以避免上述錯誤。

(2)一般我們使用Receiver是為了接受通知來更改UI(特殊情況除外),而對於Activity(UI)界面位於后台時,沒必要去接受通知更改UI。

示例:

在 Adroid2.1 和 Adroid2.2 設備上,如果 Activity 中使用到 ViewFlipper 控件,進行橫豎屏切換操作時會發生如下錯誤信息

java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper$1@43dee3c0

這是由於 onDetachedFromWindow() 莫名其妙地在 onAttachedToWindow() 之前被調用了。據說是一個 Bug ,不知在最新的 2.3 上是否修正。

下面提供一個很簡單的解決方案,重寫 ViewFlipper 的 onDetachedFromWindow() 方法

@Override
protected void onDetachedFromWindow () {
try {
super.onDetachedFromWindow();
}
catch (IllegalArgumentException e) {
stopFlipping();
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM