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




