使用单例类传递BluetoothSocket到Activity时出现空指针异常
问题分析与解决方案
你的单例实现存在致命错误,导致每次调用getInstance()时,若instance为null都会创建新对象,根本没实现真正的单例模式——这就是第二个Activity拿到空BluetoothSocket的原因。
错误点
原getInstance()方法中,当instance == null时,直接返回new SingletonSocket(),但没有把这个新实例赋值给静态变量instance。后续调用getInstance()时,instance依然是null,会再次创建新对象,导致你在第一个Activity设置的socket和第二个Activity获取的socket属于不同的SingletonSocket实例。
修正后的单例代码
package com.example.wheelchairapp; import android.bluetooth.BluetoothSocket; public class SingletonSocket { private static volatile SingletonSocket instance = null; private BluetoothSocket socket; // 建议加private封装,符合面向对象封装原则 private SingletonSocket() { } public static synchronized SingletonSocket getInstance() { if (instance == null) { instance = new SingletonSocket(); // 关键:把新实例赋值给静态instance变量 } return instance; } public synchronized void setSocket(BluetoothSocket BTS) { this.socket = BTS; } public synchronized BluetoothSocket getSocket() { return socket; } }
额外注意事项
- 确保调用
manageMyConnectedSocket(mmSocket)时,传入的mmSocket本身不为null,可在调用前添加非空判断避免无效赋值 - 若App因系统内存回收重启,单例会重新初始化,socket也会变为null,这种场景需要额外处理蓝牙重连逻辑
内容的提问来源于stack exchange,提问作者Shady Abdulmunim
相关产品推荐
相关产品推荐

