You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Epson TM-P80打印机监听器异常:状态仅触发一次、连接事件无响应

解决Epson TM-P80蓝牙打印机状态监听失效问题

我看了你用Epson Android SDK开发的代码,发现几个关键的顺序问题导致监听器没按预期工作,下面给你一步步梳理解决:

1. 监听器注册时机错误

你现在是在connect()之后才注册setConnectionEventListener()这些监听器,但连接过程中的事件(比如连接成功/失败)是在connect()执行阶段触发的,等你注册完,这些事件已经错过了,所以onConnection()永远不会被调用。

正确做法:先注册所有监听器,再调用connect()

2. 监控间隔设置顺序不对

你先调用了startMonitor()再设置setInterval(1000),但startMonitor()会启动监控线程,线程启动后不会再读取新的间隔值,所以你的每秒上报设置根本没生效。

正确做法:先设置间隔,再启动监控。

3. onPtrStatusChange()的触发逻辑误解

这个回调默认是打印机状态发生变化时才触发,不是定时主动上报。如果你需要每秒都获取状态,得自己加定时任务主动查询。

修正后的代码示例

连接方法调整

private boolean connectPrinter() {
    if (mPrinter == null) {
        return false;
    }
    try {
        // 第一步:先注册所有监听器
        mPrinter.setReceiveEventListener(this);
        mPrinter.setConnectionEventListener(this);
        mPrinter.setStatusChangeEventListener(this);
        
        // 第二步:设置监控间隔,再启动监控
        mPrinter.setInterval(1000);
        mPrinter.startMonitor();
        
        // 第三步:执行连接操作
        mPrinter.connect("BT:00:01:03:AA:BB:CC", Printer.PARAM_DEFAULT);
        
    } catch (Exception e) {
        ShowMsg.showException(e, "connect", mContext);
        return false;
    }
    return true;
}

主动定时查询状态(如果需要每秒上报)

如果需要每秒主动获取状态,而不是只等变化通知,可以加个Handler定时任务:

private Handler mStatusHandler = new Handler();
private Runnable mStatusRunnable = new Runnable() {
    @Override
    public void run() {
        if (mPrinter != null && mPrinter.isConnected()) {
            try {
                int status = mPrinter.getPrinterStatus();
                // 这里可以解析状态码,判断低电量、缺纸、卡纸等
                System.out.println("当前打印机状态:" + status);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 每秒重复执行
        mStatusHandler.postDelayed(this, 1000);
    }
};

// 在连接回调中启动/停止定时任务
@Override
public void onConnection(Object o, int i) {
    System.out.println("onConnection 触发,事件码:" + i);
    if (i == ConnectionListener.EVENT_CONNECT_SUCCESS) {
        // 连接成功后启动定时查询
        mStatusHandler.post(mStatusRunnable);
    } else {
        // 断开连接时停止任务
        mStatusHandler.removeCallbacks(mStatusRunnable);
    }
}

清理资源避免内存泄漏

记得在Activity销毁时停止监控和定时任务:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mPrinter != null) {
        mPrinter.stopMonitor();
        try {
            mPrinter.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        mPrinter = null;
    }
    mStatusHandler.removeCallbacks(mStatusRunnable);
}

内容的提问来源于stack exchange,提问作者derrickrozay

火山引擎 最新活动