android 接收广播意图错误:java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetoot

今天在调试毕设项目的时候,点击“搜索蓝牙”按钮,竟然无故运行停止,看了logcat信息为:

11-10 11:04:27.952 6381-6381/com.example.hyh.cgmms E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.example.hyh.cgmms, PID: 6381 java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetooth.adapter.action.DISCOVERY_FINISHED flg=0x10 } in com.example.hyh.cgmms.Activity.BlueToothDeviceListActivity$1@42ac9c80 at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:808) at android.os.Handler.handleCallback(Handler.java:808) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5292) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at com.example.hyh.cgmms.Activity.BlueToothDeviceListActivity$1.onReceive(BlueToothDeviceListActivity.java:146) at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:798)             at android.os.Handler.handleCallback(Handler.java:808)             at android.os.Handler.dispatchMessage(Handler.java:103)             at android.os.Looper.loop(Looper.java:193)             at android.app.ActivityThread.main(ActivityThread.java:5292)             at java.lang.reflect.Method.invokeNative(Native Method)             at java.lang.reflect.Method.invoke(Method.java:515)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)             at dalvik.system.NativeStart.main(Native Method)

奇怪,我以前从没遇到过这个问题,赶紧去拷问度娘,发现遇到这个问题的人还真不少,这真应了那句话:你目前正在做的事情之前一定有人已经做过,而且比你做得好。

方法一:操作都放进if语句中

http://blog.csdn.net/yangqicong11/article/details/8955674

上面这篇博客的作者给出的解决方案是:

在广播接收器的OnReceive函数中,将除了String action = intent.getAction() 的操作放到if语句中,保证广播接收器的不同ACTION不会处理相同的取函数代码

但说实话,我除了这条语句,其他的还真的都在if语句中,所以该方法对我没用。不过,说不定在其他地方可用。


方法二:避免对Null对象操作

http://stackoverflow.com/questions/27709194/error-receiving-broadcast-intent-act-android-bluetooth-device-action-found-flg

方法源自这篇帖子,原话是这么说的:

bthDispositivosArea, your ArrayAdapter is null because you haven't initialized it anywhere. And you're trying to add something to a null object.

我检查了一下,我的代码里的确有对listView适配器的操作,可能就是在这个控件还没初始化广播接收器就调用,导致了问题。故修改了代码:

case BluetoothAdapter.ACTION_DISCOVERY_FINISHED: //监听到:蓝牙搜索结束了 System.out.println("搜索结束了"); //btList=new ArrayList(); // mbtAdapter.notifyDataSetChanged(); Log.d("TC_Log", "search completed"); int foundDeviceNumber=0; if(foundDevices!=null){ foundDeviceNumber=foundDevices.size(); } // int foundDeviceNumber=foundDevices.size(); // System.out.println("搜索到设备了吗?咋不显示+zaiwaitou"+foundDevices.size()); if (foundDevices!= null && foundDeviceNumber>0) { System.out.println("搜索到设备了吗?咋不显示"+foundDevices.size()); Log.d("TC_Log", "searched " + foundDevices.size() + " device(s)"); if(mbtAdapter!=null) { mbtAdapter.notifyDataSetChanged(); } }  

当然,代码只截取了片段,但里面包含我修改的部分,方便以后查看。




你可能感兴趣的:(编程细节错误)