我正在使用蓝牙发现的应用程序非常重要(一些细节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(即使它是假的) - 有没有人对蓝牙内部有足够的了解,弄清楚为什么禁用崩溃对我?
答案 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
}