From 2e384907c119b8eea9ddcccb40ac9face1c42e3d Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Mon, 21 Mar 2022 18:53:33 +0800 Subject: [PATCH] =?UTF-8?q?[Fix]=E8=A7=A3=E5=86=B3=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E5=90=88=E6=88=90crash=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:线程安全导致资源相关的String数组部分元素被置为null,而语音合成SDK遍历该String数组时没有判断元素是否为null,直接调用AssetManager.open()触发空指针异常而SDK只捕获了IO异常,导致Crash --- .../main/java/com/mogo/tts/pad/PadTTS.java | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java b/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java index f5eee60e6e..691033e5e6 100644 --- a/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java +++ b/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java @@ -18,13 +18,13 @@ import com.aispeech.export.config.AuthConfig; import com.aispeech.export.config.EchoConfig; import com.aispeech.export.engines.AILocalTTSEngine; import com.aispeech.export.intent.AILocalTTSIntent; -import com.aispeech.export.listeners.AILocalTTSListener; import com.aispeech.export.listeners.AITTSListener; import com.aispeech.lite.AuthType; import com.alibaba.android.arouter.facade.annotation.Route; import com.mogo.cloud.commons.BuildConfig; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.util.ThreadUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.tts.base.IMogoTTS; import com.mogo.tts.base.IMogoTTSCallback; @@ -59,27 +59,29 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList private boolean mInitReady = true; private Context mContext; - public synchronized void release() { + public void release() { CallerLogger.INSTANCE.d(TAG, "release"); - if (mCmdMap != null && !mCmdMap.isEmpty() && mVoiceClient != null) { - for (String cmd : mCmdMap.keySet()) { - try { - mVoiceClient.unRegisterCustomWakeupCmd(cmd); - } catch (Exception e) { - e.printStackTrace(); + ThreadUtils.runOnUiThread(() -> { + if (mCmdMap != null && !mCmdMap.isEmpty() && mVoiceClient != null) { + for (String cmd : mCmdMap.keySet()) { + try { + mVoiceClient.unRegisterCustomWakeupCmd(cmd); + } catch (Exception e) { + e.printStackTrace(); + } } } - } - mQAndAMap.clear(); - mVoiceClient.release(); - if (mEngine != null) { - mEngine.destroy(); - mEngine = null; - } - mHasAuth = false; - mSpeakVoiceMap.clear(); - mCacheUnWakeupCommands.clear(); - mContext = null; + mQAndAMap.clear(); + mVoiceClient.release(); + if (mEngine != null) { + mEngine.destroy(); + mEngine = null; + } + mHasAuth = false; + mSpeakVoiceMap.clear(); + mCacheUnWakeupCommands.clear(); + mContext = null; + }); } private VoiceClient mVoiceClient; @@ -147,8 +149,10 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList @Override public void success() { CallerLogger.INSTANCE.d(TAG, "授权成功"); - mHasAuth = true; - initTtsEngine(); + ThreadUtils.runOnUiThread(() -> { + mHasAuth = true; + initTtsEngine(); + }); } @Override @@ -251,7 +255,7 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList if (!mCmdMap.containsKey(cmd)) { return; } - CallerLogger.INSTANCE.d(TAG, "received command : " + cmd); + CallerLogger.INSTANCE.d(TAG, "received command : " + cmd); Iterator iterator = null; try { @@ -447,7 +451,7 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList mVoiceClient.registerCustomWakeupCmd(cmd, cmdWords); mCacheUnWakeupCommands.remove(cmd); } - CallerLogger.INSTANCE.i(TAG, "cache un wakeup command2. " + cmd); + CallerLogger.INSTANCE.i(TAG, "cache un wakeup command2. " + cmd); mCacheUnWakeupCommands.put(cmd, cmdWords); } @@ -463,7 +467,7 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList mVoiceClient.registerCustomWakeupCmd(cmd, cmdWords); mCacheUnWakeupCommands.remove(cmd); } - CallerLogger.INSTANCE.i(TAG, "cache un wakeup command. " + cmd); + CallerLogger.INSTANCE.i(TAG, "cache un wakeup command. " + cmd); mCacheUnWakeupCommands.put(cmd, cmdWords); } @@ -514,7 +518,7 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList * @param status window_start_cancel 0 - 结束, 1 - 显示, 2 - 未激活调试进入 */ public static void startAssistant(Context context, int status) { - CallerLogger.INSTANCE.w(TAG, "startAssistant status = " + status); + CallerLogger.INSTANCE.w(TAG, "startAssistant status = " + status); final Intent intent = new Intent(); intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);