2013-10-28 78 views
7

我收到以下錯誤缺少一個電話註銷,我從來沒有註冊

「是否缺少一個電話註銷接收器」

當我打的返回按鈕退出HapticFeedbackBroadcastReceiver接收我的應用。如何識別哪個接收器導致泄漏並消除錯誤?我使用Google的代碼「DownLoader」來下載擴展文件。

10-27 22:13:32.818: E/ActivityThread(30744): Activity com.ssowens.groovebasstrial.BassActivity has leaked IntentReceiver com.immersion.androi[email protected]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.androi[email protected]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

[自從升級到Android 4.2.2奇怪的錯誤 - 活動已泄漏IntentReceiver]的可能的複製(HTTP ://stackoverflow.com/questions/18324791/strange-error-since-upgrading-to-android-4-2-2-activity-has-leaked-intentrecei) – blahdiblah

回答

1

您必須在您在活動中註冊的任何接收者調用unregisterReceiver()。這通常會在onPause()中。

1

如何識別哪個接收器導致泄漏並消除錯誤?

答案在您發佈的LogCat中。

Activity com.ssowens.groovebasstrial.BassActivity has leaked IntentReceiver com.immersion.androi[email protected]41d166d0 that was originally registered here. 

您在BassActivity註冊一個HapticFeedbackBroadcastReceiver,這就需要將未註冊時暫停或關閉該應用程序。作爲@svenoaks說,你應該重寫Activity.onPause()和註銷每次您註冊接收器,使用unregisterReceiver(referenceToReceiver);

+0

感謝您的反饋意見。 @Ole但是,我在我的代碼中搜索了HapticFeedbackBroadcastReceiver,並且找不到匹配項。我假設它是當我使用onTouchListener。因此,要取消註冊,我會取消註冊onTouchListener?不知道如何取消註冊。 – sowens

+3

@sowens您是否在運行4.2.2的三星設備上測試您的應用程序?根據[this](http://stackoverflow.com/questions/18324791/strange-error-since-upgrading-to-android-4-2-2-activity-has-leaked-intentrecei),似乎有在Samsungs 4.2.2 build – Ole

+0

中的錯誤是的,我運行的是Samsung 4.2.2版本。多麼不幸的是,這個錯誤正在發生。我在帖子中沒有看到任何工作。 – sowens

10

解決方法1.

如果你有一個ItemClickListener一個ListView你必須設置聽者對空overover方法onPause。

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實例你必須始終註銷未overrive方法的onPause。

@覆蓋 保護無效的onPause(){

super.onPause(); 
    synchronized (this) { 
     if(broadcastReceiverInstance != null){ 
      unregisterReceiver(broadcastReceiverInstance); 
     } 
    } 

} 

我知道這並不爲你工作,不過我沒有參考的第二個解決方案。

我希望它可以幫助你。

+0

謝謝你對我的問題的迴應。但是,請參閱上面的註釋。看起來像我的問題是特定於我的Android(4.2.2)版本和我正在使用的平板電腦(三星7英寸)。 @Schwertfisch – sowens

+0

@sowens我認爲你的問題是與一個ListView。如果你有一個問題是,你沒有設置你的listview監聽器覆蓋onPause。對不起,我的英語不好。我要編輯答案。 告訴我它是否有效。 – schwertfisch

+0

謝謝,我會試一試,讓你知道,如果這有效。 – sowens

3

這是一個工作!我有一個三星片7" 4.2.2

的問題的原因:在Layout.xml
3.新的ListView定義
1. 4.2.2
2. ListView中(本)

修復:
1.不要在Layout中聲明一個ListView,而是聲明一個持有者
2.使用'getApplication()'而不是'this''新的ListView(getApplication());' 3 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); 
} 
+0

我會試試看。 @bear – sowens

+0

您不必創建持有人。只需在onStop()中取消適配器並根據需要進行重置更簡單 – Kalle