java.lang.IllegalArgumentException:レシーバーが登録されていません



Java Lang Illegalargumentexception



エラーメッセージ:java.lang.IllegalArgumentException:レシーバーが登録されていません。 。

名前が示すように、未登録のレシーバーによって引き起こされたエラーがキャンセルされたため、レシーバーは登録されていません。



Receiverを使用する場合は、登録と登録解除がペアになっていることを確認する必要があります。

この問題が発生した場合は、自分のコードに登録されているコードと登録解除されているコードをチェックして、登録解除の呼び出しが複数あるかどうかを確認する必要があります。



多くの場合、そうなると思いますが、プログラムに予期せぬ輸出が発生する可能性があります。たとえば、私のプログラムはonCreateに登録されており、finishは登録をキャンセルし、理論は開始または終了するときにペアになっている必要がありますが、実際のエラーが報告されます。分析の最後に、元のレイアウトはTabActivity、GroupActivity、およびその他の構造のネストを使用します。現在のアクティビティを終了すると、finishメソッドが複数回実行されます。

したがって、次の2つの理由から、Receiverの登録プロセスと登録防止プロセスをonResumeプロセスとonPauseプロセスに配置することをお勧めします。

(1)これら2つのプロセスは確実にペアで表示されるため、上記の間違いを回避できます。



(2)通常、Receiverを使用してUIを変更する通知を受け入れます(特別な場合を除く)。アクティビティ(UI)インターフェイスがバックグラウンドにある場合、UIを変更するために通知を受け入れる必要はありません。

例:

Adroid2.1およびAdroid2.2デバイスで、アクティビティでViewFlipperコントロールが使用されている場合、水平および垂直の画面切り替え操作を実行すると、次のエラーメッセージが表示されます。

java.lang.IllegalArgumentException:レシーバーが登録されていません:root @ xxxxx

これは、onDetachedFromWindow()がonAttachedToWindow()の前に不可解に呼び出されるためです。バグと言われていますが、最新の2.3で修正されているかどうかはわかりません。

これは、ViewFlipperのonDetachedFromWindow()メソッドをオーバーライドするための非常に簡単なソリューションです。

@オーバーライド
protected void onDetachedFromWindow(){
{を試してください
super.onDetachedFromWindow()
}
catch(IllegalArgumentException e){
stopFlipping()
}
}

方法2:このメソッドは、登録を初期化するためにonresumeに配置されます。一時停止で登録を解除します。

@Override protected void onResume() { super.onResume() if (receiver == null) { filter = new IntentFilter(ResponseReceiver.ACTION_RESP) filter.addCategory(Intent.CATEGORY_DEFAULT) receiver = new ResponseReceiver() registerReceiver(receiver, filter) } } @Override protected void onPause() { super.onPause() if (receiver != null) { unregisterReceiver(receiver) receiver = null } }

方法3:受信機をオンデストリーで空にします

@Override