You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用单例类传递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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:54:55