diff --git a/app/src/main/java/com/example/kingway/ptt/AudioRecordManager.java b/app/src/main/java/com/example/kingway/ptt/AudioRecordManager.java index 10e3f2d..147e29c 100644 --- a/app/src/main/java/com/example/kingway/ptt/AudioRecordManager.java +++ b/app/src/main/java/com/example/kingway/ptt/AudioRecordManager.java @@ -75,6 +75,29 @@ public class AudioRecordManager { return mInstance; } + /** + * 彻底销毁单例及相关资源 + */ + public static void destroy() { + if (mInstance != null) { + synchronized (AudioRecordManager.class) { + if (mInstance != null) { + try { + mInstance.destroyAudio(); + } catch (Exception e) { + Timber.tag("AudioRecordManager").e(e, "destroyAudio error"); + } + try { + mInstance.destroyThread(); + } catch (Exception e) { + Timber.tag("AudioRecordManager").e(e, "destroyThread error"); + } + mInstance = null; + } + } + } + } + /** * 销毁线程方法 */ diff --git a/app/src/main/java/com/stand/standapp/MainActivity.kt b/app/src/main/java/com/stand/standapp/MainActivity.kt index 2f8dd07..deef858 100644 --- a/app/src/main/java/com/stand/standapp/MainActivity.kt +++ b/app/src/main/java/com/stand/standapp/MainActivity.kt @@ -532,18 +532,18 @@ class MainActivity : AppCompatActivity() { // 4. Stop and destroy AudioRecord try { - com.example.kingway.ptt.AudioRecordManager.getInstance().destroyAudio() + com.example.kingway.ptt.AudioRecordManager.destroy() Timber.tag("MainActivity").i("AudioRecordManager destroyed") } catch (e: Exception) { Timber.tag("MainActivity").e(e, "AudioRecordManager destroy failed") } - // 5. Close printer connection + // 5. Close printer connection and reset try { - com.stand.standapp.printer.PrinterManager.getFactory()?.ClosePort() - Timber.tag("MainActivity").i("Printer port closed") + com.stand.standapp.printer.PrinterManager.destroy() + Timber.tag("MainActivity").i("Printer destroyed") } catch (e: Exception) { - Timber.tag("MainActivity").e(e, "Printer close failed") + Timber.tag("MainActivity").e(e, "Printer destroy failed") } // 6. Clear Access Token diff --git a/app/src/main/java/com/stand/standapp/printer/PrinterManager.kt b/app/src/main/java/com/stand/standapp/printer/PrinterManager.kt index 3385c40..bc6226a 100644 --- a/app/src/main/java/com/stand/standapp/printer/PrinterManager.kt +++ b/app/src/main/java/com/stand/standapp/printer/PrinterManager.kt @@ -8,12 +8,13 @@ import com.dp.dp_serialportlist.Serialport_Factory import com.stand.standapp.AppConfig import timber.log.Timber import java.util.concurrent.Executors +import java.util.concurrent.ScheduledExecutorService import java.util.concurrent.TimeUnit object PrinterManager { private var sf: Serialport_Factory? = null private var isConnecting = false - private val executor = Executors.newSingleThreadScheduledExecutor() + private var executor: ScheduledExecutorService? = null private var mContext: Context? = null private var hasPaper: Boolean = true // 默认为有纸 @@ -43,6 +44,9 @@ object PrinterManager { fun init(context: Context) { if (sf != null) return mContext = context.applicationContext + if (executor == null || executor!!.isShutdown) { + executor = Executors.newSingleThreadScheduledExecutor() + } // Serialport_Factory 构造函数内部会创建 Handler,必须在有 Looper 的线程(如主线程)调用 mHandler.post { @@ -51,9 +55,9 @@ object PrinterManager { sf = Serialport_Factory.getSerialport_Factory(mContext, mHandler) // 成功创建 factory 后,将后续耗时的连接任务丢给子线程 - executor.execute { + executor?.execute { // 启动自动重连定时任务 - executor.scheduleWithFixedDelay({ + executor?.scheduleWithFixedDelay({ checkAndConnect() }, 0, 10, TimeUnit.SECONDS) } @@ -65,6 +69,26 @@ object PrinterManager { } } + fun destroy() { + Timber.tag("Printer").i("正在销毁并重置打印机组件...") + try { + executor?.shutdownNow() + executor = null + } catch (e: Exception) { + Timber.tag("Printer").e(e, "关闭打印机线程池异常") + } + try { + sf?.ClosePort() + sf = null + } catch (e: Exception) { + Timber.tag("Printer").e(e, "关闭打印机串口异常") + } + mContext = null + isConnecting = false + hasPaper = true + Timber.tag("Printer").i("打印机组件销毁完成") + } + @Synchronized private fun checkAndConnect() { val factory = sf ?: return diff --git a/app/src/main/java/com/stand/standapp/utils/GpioManager.kt b/app/src/main/java/com/stand/standapp/utils/GpioManager.kt index dfa9b20..351ad29 100644 --- a/app/src/main/java/com/stand/standapp/utils/GpioManager.kt +++ b/app/src/main/java/com/stand/standapp/utils/GpioManager.kt @@ -58,6 +58,10 @@ object GpioManager { mIsRunning = false mThread?.interrupt() mThread = null + mZysjSystemManager = null + isSpeaking = false + lastGpioValue = 1 + Timber.tag("GPIO").i("GPIO listening stopped and state reset") } private var isSpeaking = false