调用BluetoothAdapter.disable()时,偶尔会出现NullPointerException(Android)

时间:2012-05-30 19:58:48

标签: android bluetooth nullpointerexception

我正在使用蓝牙发现的应用程序非常重要(一些细节here)。该应用程序的本质是,我几乎始终保持BT并等待来自某些广播设备的BT名称的更改。由于我的设备是永久充电,因此用电不是问题。

我发现在某些时候我的应用程序“丢失线程”并且在BT上没有发现任何内容,即使BT已打开,并且有范围内的设备。以手动方式,我可以通过关闭和打开设备上的BT来解决这个问题 - presto!它又有效了。所以我想在代码中这样做。我有一个完整的超时计时器,它向处理程序发送一条消息:

        bluetoothHandler = new Handler() {
        @Override
        public void  handleMessage(Message msg) {
            if (!btAdapter.isDiscovering())
            {
                btAdapter.disable();
                btAdapter.enable();
                btAdapter.startDiscovery();
                // some other stuff
            }

好吧,这段代码似乎有时会因“禁用”行

上的空指针异常而崩溃

以下是ACRA信息:

"java.lang.NullPointerException
    at android.os.Parcel.readException(Parcel.java:1328)
    at android.os.Parcel.readException(Parcel.java:1276)
    at android.bluetooth.IBluetooth$Stub$Proxy.disable(IBluetooth.java:604)
    at android.bluetooth.BluetoothAdapter.disable(BluetoothAdapter.java:562)
    at com.myapp.stuff.MainActivity$8.handleMessage(MainActivity.java:574)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3687)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    at dalvik.system.NativeStart.main(Native Method)

正如你所看到的那样,btAdapter确实为空是没有意义的,否则我们会在之前的行中崩溃(“if”) - 甚至假设代码是可重入的,我也不会为null我的代码中的btAdapter随时都可以 - 我在OnCreate中设置它并永远保留它,那么它是如何变为null的?

我看到有几个人发帖说他们得到NullPointerException来执行启用/禁用代码 - 以及建议使用Intents来启动/停止蓝牙 - 这不是一个选项 - 没有用户干预 - 用户(如果他们希望这个相当专业的应用程序工作)需要BT自动运行(如果没有正确运行)。

我假设我不能在NullPointerException周围放置一个try / catch(即使它是假的) - 有没有人对蓝牙内部有足够的了解,弄清楚为什么禁用崩溃对我?

3 个答案:

答案 0 :(得分:0)

它发生在disable方法中。可能是android源代码读取文件BluetoothAdapter.java,第562行可以帮助您了解可能导致此问题的原因。

答案 1 :(得分:0)

我认为你应该把断言作为handleMessage函数的第一行,例如assertNotNull(btAdapter)。断言Here's the doc。至少你知道btAdapter确实不是null。

这并不能真正解决您的问题,但您的问题提醒您断言可能会有所帮助。

答案 2 :(得分:0)

好吧,我真的不明白出了什么问题,但我的解决方案相当简单而且很愚蠢:

我没有为btAdapter留下一个值,而是在每次使用它之前检查它并尝试/ catch任何异常(虽然我假设这不会捕获REAL空指针)

所以每次我禁用(崩溃)我都会这样做

                btAdapter = BluetoothAdapter.getDefaultAdapter();
                if (null == btAdapter)
                {
                    Log.e(LOG_TAG,"Bluetooth adapter is NULL!!!");
                    return;
                }
                try {
                    btAdapter.disable();
                }
                catch (Exception e) {
                    //don't do anything
                }