2013-01-21 65 views
1

我做了一個簡單的應用程序,監視設備的電池電量。 我用這個代碼:intent.action.BATTERY_CHANGED期間發生致命異常

private void setProperImageByBatteryLevel() { 

    BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      context.unregisterReceiver(this); 
      int rawlevel = intent.getIntExtra("level", -1); 
      int scale = intent.getIntExtra("scale", -1); 
      int level = -1; 
      if (rawlevel >= 0 && scale > 0) { 
       level = (rawlevel * 100)/scale; 
      } 
      if (DEBUG) { 
       Log.i(TAG, "Charge: " + Integer.toString(level) + "%"); 
      } 
      if (level > 80) { 
       batteryImg.setImageResource(R.drawable.bat100); 
      } else if (level > 60) { 
       batteryImg.setImageResource(R.drawable.bat80); 
      } else if (level > 40) { 
       batteryImg.setImageResource(R.drawable.bat60); 
      } else if (level > 20) { 
       batteryImg.setImageResource(R.drawable.bat40); 
      } else if (level > 0) { 
       batteryImg.setImageResource(R.drawable.bat20); 
      } 
     } 
    }; 
    IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    activity.registerReceiver(batteryLevelReceiver, batteryLevelFilter); 
} 

它可以正常工作,但有時我得到以下異常:(約10/1倍)

01-21 13:16:56.617: E/AndroidRuntime(7810): FATAL EXCEPTION: main 
01-21 13:16:56.617: E/AndroidRuntime(7810): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.BATTERY_CHANGED flg=0x60000000 (has extras) } in [email protected] 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:722) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at android.os.Handler.handleCallback(Handler.java:587) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at android.os.Handler.dispatchMessage(Handler.java:92) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at android.os.Looper.loop(Looper.java:123) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at java.lang.reflect.Method.invoke(Method.java:507) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at dalvik.system.NativeStart.main(Native Method) 
01-21 13:16:56.617: E/AndroidRuntime(7810): Caused by: java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:610) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:919) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at hu.trendency.activitimap.widgets.Battery$2.onReceive(Battery.java:92) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709) 
01-21 13:16:56.617: E/AndroidRuntime(7810):  ... 9 more 

任何人看到這個問題?

編輯:

我改變了你告訴我,現在我得到這樣的方式:

01-23 14:43:40.205: E/AndroidRuntime(27064): FATAL EXCEPTION: main 
01-23 14:43:40.205: E/AndroidRuntime(27064): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.BATTERY_CHANGED flg=0x60000000 (has extras) } in [email protected] 
01-23 14:43:40.205: E/AndroidRuntime(27064): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:722) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at android.os.Handler.handleCallback(Handler.java:587) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at android.os.Looper.loop(Looper.java:123) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at android.app.ActivityThread.main(ActivityThread.java:3687) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at java.lang.reflect.Method.invokeNative(Native Method) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at java.lang.reflect.Method.invoke(Method.java:507) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at dalvik.system.NativeStart.main(Native Method) 
01-23 14:43:40.205: E/AndroidRuntime(27064): Caused by: java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
01-23 14:43:40.205: E/AndroidRuntime(27064): at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:610) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:919) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at hu.trendency.activitimap.widgets.Battery$2.onReceive(Battery.java:93) 
01-23 14:43:40.205: E/AndroidRuntime(27064): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709) 
+0

不要在其內部註冊廣播寄存器。要麼把它在清單或活動你的問題是java.lang.IllegalArgumentException:收件人未註冊:[email protected] – 2013-01-21 12:25:45

+0

可以參考http://stackoverflow.com/questions/6165070/receiver-沒有註冊異常錯誤.. – user1969053

回答

3

變化

context.unregisterReceiver(this); 

activity.unregisterReceiver(this); 

因爲上下文,你獲得onReceive()可能會或可能不是您用於首先註冊接收器的上下文。

您也可以使用try/catch塊環繞對unregisterReceiver()的調用,並捕獲並忽略IllegalArgumentException

+0

我試着兩個,讓我們看到錯誤消失:) –

+0

另一個例外,也許我應該開始它。 –

+0

那麼,您需要跟蹤您註冊接收器的位置,以便您可以正確取消註冊。要麼是這樣,要麼只是在註銷時忽略和忽略所有異常。 –

相關問題