|
根据你提供的代码和问题描述,应用出现无响应问题可能有以下几个原因和解决方案:
可能的原因分析
1. LLM处理阻塞主线程
从代码中可以看到 llm.MyLlmDeal(text) 是在主线程中直接调用的,如果LLM处理耗时较长,会导致UI线程阻塞。
2. 讯飞SDK初始化问题
讯飞语音识别初始化可能存在问题,导致后续功能无法正常工作。
3. 网络请求阻塞
如果LLM需要网络请求,而没有在后台线程执行,也会导致ANR。
解决方案
1. 将LLM处理移到后台线程
修改 callLlm 方法,使用异步处理:
- private void callLlm(String text, String caller) {
- Log.i(TAG, caller + ", " + text + ", before use llm.");
-
- if (llm != null) {
- Log.i(TAG, "llm is not null, continue to llm.MyLlmDeal(text))...");
-
- // 使用AsyncTask或新线程处理耗时操作
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- String llmResult = llm.MyLlmDeal(text);
- llmResult = MainActivityKt.wash(llmResult);
-
- // 切换回主线程更新UI
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- if (llmResult != null) {
- Log.i(TAG, "llmResult isn't null.");
- mResultText.append(llmResult);
- mResultText.setSelection(mResultText.length());
- }
- }
- });
- } catch (Exception e) {
- Log.e(TAG, "LLM processing error: " + e.getMessage());
- }
- }
- }).start();
- }
- }
复制代码 2. 添加讯飞SDK初始化检查
在 onCreate 方法中添加更完善的错误处理:
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.iatdemo);
- Log.i(TAG, "Before speechUtility.create");
- try {
- com.iflytek.cloud.SpeechUtility.createUtility(IatDemo.this, "appid=" + getString(R.string.app_id));
- Log.i(TAG, "SpeechUtility created successfully.");
- } catch (Exception e){
- Log.e(TAG, "SpeechUtility creation failed: " + e.getMessage());
- showTip("语音服务初始化失败");
- return;
- }
- initLayout();
-
- Log.i(TAG, "onCreate, before init llm.");
- // LLM初始化也应考虑异步处理
- new Thread(() -> {
- try {
- llm = new MyJavaOpenAIAPI();
- runOnUiThread(() -> {
- if (llm != null) {
- Log.i(TAG, "onCreate, llm created ok.");
- } else {
- Log.e(TAG, "onCreate, llm created failed.");
- }
- });
- } catch (Exception e) {
- Log.e(TAG, "LLM initialization failed: " + e.getMessage());
- }
- }).start();
- Log.i(TAG, "onCreate, Before create mIat...");
- mIat = SpeechRecognizer.createRecognizer(this, mInitListener);
- if (mIat == null) {
- showTip("语音识别对象创建失败");
- Log.e(TAG, "SpeechRecognizer creation failed");
- } else {
- Log.i(TAG, "onCreate, After create mIat.");
- }
- mIatDialog = new RecognizerDialog(this, mInitListener);
- mSharedPreferences = getSharedPreferences(IatSettings.PREFER_NAME, Activity.MODE_PRIVATE);
- mResultText = ((EditText) findViewById(R.id.iat_text));
- }
复制代码 3. 添加超时机制
为LLM处理添加超时机制:
- private void callLlm(String text, String caller) {
- Log.i(TAG, caller + ", " + text + ", before use llm.");
-
- if (llm != null) {
- Log.i(TAG, "llm is not null, continue to llm.MyLlmDeal(text))...");
-
- Thread llmThread = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- String llmResult = llm.MyLlmDeal(text);
- llmResult = MainActivityKt.wash(llmResult);
-
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- if (llmResult != null) {
- Log.i(TAG, "llmResult isn't null.");
- mResultText.append(llmResult);
- mResultText.setSelection(mResultText.length());
- }
- }
- });
- } catch (Exception e) {
- Log.e(TAG, "LLM processing error: " + e.getMessage());
- runOnUiThread(() -> showTip("LLM处理出错"));
- }
- }
- });
-
- llmThread.start();
-
- // 添加超时处理(例如10秒超时)
- try {
- llmThread.join(10000); // 等待10秒
- if (llmThread.isAlive()) {
- llmThread.interrupt();
- runOnUiThread(() -> showTip("LLM处理超时"));
- }
- } catch (InterruptedException e) {
- Log.e(TAG, "LLM processing interrupted: " + e.getMessage());
- }
- }
- }
复制代码 4. 检查权限配置
确保在 AndroidManifest.xml 中添加了必要权限:
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.RECORD_AUDIO" />
复制代码 5. 添加网络状态检查
在调用LLM前检查网络状态:
- private boolean isNetworkAvailable() {
- ConnectivityManager connectivityManager =
- (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
- return activeNetworkInfo != null && activeNetworkInfo.isConnected();
- }
- private void callLlm(String text, String caller) {
- Log.i(TAG, caller + ", " + text + ", before use llm.");
-
- if (!isNetworkAvailable()) {
- showTip("网络不可用");
- return;
- }
-
- // 其余代码不变
- // ...
- }
复制代码
|
|