我收到以下错误
“你是否错过了取消注册接收者的呼叫”
当我点击后退按钮退出我的应用程序时。如何识别哪个Receiver导致泄漏并消除错误?我使用Google的代码“DownLoader”下载扩展文件。
10-27 22:13:32.818: E/ActivityThread(30744): Activity com.ssowens.groovebasstrial.BassActivity has leaked IntentReceiver com.immersion.android.haptics.HapticFeedbackManager$HapticFeedbackBroadcastReceiver@41d166d0 that was originally registered here. Are you missing a call to unregisterReceiver()?
10-27 22:13:32.818: E/ActivityThread(30744): android.app.IntentReceiverLeaked: Activity com.ssowens.groovebasstrial.BassActivity has leaked IntentReceiver com.immersion.android.haptics.HapticFeedbackManager$HapticFeedbackBroadcastReceiver@41d166d0 that was originally registered here. Are you missing a call to unregisterReceiver()?
10-27 22:13:32.818: E/ActivityThread(30744): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:800)
10-27 22:13:32.818: E/ActivityThread(30744): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:601)
10-27 22:13:32.818: E/ActivityThread(30744): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1650)
10-27 22:13:32.818: E/ActivityThread(30744): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1630)
10-27 22:13:32.818: E/ActivityThread(30744): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1624)
10-27 22:13:32.818: E/ActivityThread(30744): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:430)
10-27 22:13:32.818: E/ActivityThread(30744): at com.immersion.android.haptics.HapticFeedbackManager.setupPackageBroadcastReceiver(HapticFeedbackManager.java:564)
10-27 22:13:32.818: E/ActivityThread(30744): at com.immersion.android.haptics.HapticFeedbackManager.<init>(HapticFeedbackManager.java:108)
10-27 22:13:32.818: E/ActivityThread(30744): at com.immersion.android.HapticFeedbackManagerProxy.initialize(HapticFeedbackManagerProxy.java:90)
10-27 22:13:32.818: E/ActivityThread(30744): at com.immersion.android.HapticFeedbackManagerProxy.access$100(HapticFeedbackManagerProxy.java:30)
10-27 22:13:32.818: E/ActivityThread(30744): at com.immersion.android.HapticFeedbackManagerProxy$1$1.run(HapticFeedbackManagerProxy.java:71)
10-27 22:13:32.818: E/ActivityThread(30744): at java.lang.Thread.run(Thread.java:856)
答案 0 :(得分:10)
解决方案1。
如果你有一个带有ItemClickListener的ListView你必须在overrive方法onPause上将监听器设置为null。
listView.setOnItemClickListener(exampleListener);
示例:您的听众声明
private OnItemClickListener exampleListener = new OnItemClickListener() {}....
@Override
public void onPause() {
super.onPause();
listView.setOnItemClickListener(null);
}
@Override
public void onResume() {
super.onResume();
if(listView != null){
listView.setOnItemClickListener(exampleListener);
}
}
解决方案2 如果您知道什么是您的broadcastReceiver实例您必须取消注册始终un overrive方法onPause。
@覆盖 protected void onPause(){
super.onPause();
synchronized (this) {
if(broadcastReceiverInstance != null){
unregisterReceiver(broadcastReceiverInstance );
}
}
}
我知道它的第二个解决方案对你不起作用,但我让它作为参考。
我希望它可以帮助你。
答案 1 :(得分:3)
这是一个解决方法!!我有一个三星标签7“4.2.2
问题原因:
1. 4.2.2
2.在Layout.xml中定义的ListView
3.新的ListView(this)
修复:
1.不要在布局中声明ListView,而是声明持有人
2.使用'getApplication()'而不是'this''new ListView(getApplication());'
3. addView(yourListView)
TheLayoutFile.xml
<RelativeLayout
android:id="@+id/listViewHolder"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</RelativeLayout>
活动中的ListView
private void displayPostsInListView() {
RelativeLayout listViewHolder = (RelativeLayout) findViewById(R.id.listViewHolder);
listView = new ListView(getApplication());
listViewHolder.addView(listView);
listView.setOnItemClickListener(lineItemListener);
adapter = new MyDisplayAdapter(this, listModel.getPostings());
listView.setAdapter(adapter);
}
答案 2 :(得分:1)
您必须在已在“活动”中注册的任何接收者上调用unregisterReceiver()。这通常是在onPause()。
答案 3 :(得分:1)
如何识别哪个接收器导致泄漏并消除错误?
答案在你发布的LogCat中。
Activity com.ssowens.groovebasstrial.BassActivity has leaked IntentReceiver com.immersion.android.haptics.HapticFeedbackManager$HapticFeedbackBroadcastReceiver@41d166d0 that was originally registered here.
您在HapticFeedbackBroadcastReceiver
中注册了BassActivity
,暂停或关闭应用时需要取消注册。正如@svenoaks所说,您应该覆盖Activity.onPause()
并使用unregisterReceiver(referenceToReceiver);
取消注册您注册的每个接收者