This commit is contained in:
844143714@qq,com 2026-07-19 03:11:20 +08:00
parent a6cd238330
commit 24c8289a0d
4 changed files with 59 additions and 8 deletions

View File

@ -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;
}
}
}
}
/**
* 销毁线程方法
*/

View File

@ -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

View File

@ -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

View File

@ -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