Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 61|回复: 0

程序出现无响应问题

[复制链接]

347

主题

501

帖子

3066

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3066
发表于 2025-9-10 09:20:48 | 显示全部楼层 |阅读模式
根据你提供的代码和问题描述,应用出现无响应问题可能有以下几个原因和解决方案:
可能的原因分析
1. LLM处理阻塞主线程
从代码中可以看到 llm.MyLlmDeal(text) 是在主线程中直接调用的,如果LLM处理耗时较长,会导致UI线程阻塞。
2. 讯飞SDK初始化问题
讯飞语音识别初始化可能存在问题,导致后续功能无法正常工作。
3. 网络请求阻塞
如果LLM需要网络请求,而没有在后台线程执行,也会导致ANR。
解决方案
1. 将LLM处理移到后台线程
修改 callLlm 方法,使用异步处理:
  1. private void callLlm(String text, String caller) {
  2.     Log.i(TAG, caller + ", " + text + ", before use llm.");
  3.    
  4.     if (llm != null) {
  5.         Log.i(TAG, "llm is not null, continue to llm.MyLlmDeal(text))...");
  6.         
  7.         // 使用AsyncTask或新线程处理耗时操作
  8.         new Thread(new Runnable() {
  9.             @Override
  10.             public void run() {
  11.                 try {
  12.                     String llmResult = llm.MyLlmDeal(text);
  13.                     llmResult = MainActivityKt.wash(llmResult);
  14.                     
  15.                     // 切换回主线程更新UI
  16.                     runOnUiThread(new Runnable() {
  17.                         @Override
  18.                         public void run() {
  19.                             if (llmResult != null) {
  20.                                 Log.i(TAG, "llmResult isn't null.");
  21.                                 mResultText.append(llmResult);
  22.                                 mResultText.setSelection(mResultText.length());
  23.                             }
  24.                         }
  25.                     });
  26.                 } catch (Exception e) {
  27.                     Log.e(TAG, "LLM processing error: " + e.getMessage());
  28.                 }
  29.             }
  30.         }).start();
  31.     }
  32. }
复制代码
2. 添加讯飞SDK初始化检查
在 onCreate 方法中添加更完善的错误处理:
  1. @Override
  2. public void onCreate(Bundle savedInstanceState) {
  3.     super.onCreate(savedInstanceState);
  4.     this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  5.     setContentView(R.layout.iatdemo);

  6.     Log.i(TAG, "Before speechUtility.create");
  7.     try {
  8.         com.iflytek.cloud.SpeechUtility.createUtility(IatDemo.this, "appid=" + getString(R.string.app_id));
  9.         Log.i(TAG, "SpeechUtility created successfully.");
  10.     } catch (Exception e){
  11.         Log.e(TAG, "SpeechUtility creation failed: " + e.getMessage());
  12.         showTip("语音服务初始化失败");
  13.         return;
  14.     }

  15.     initLayout();
  16.    
  17.     Log.i(TAG, "onCreate, before init llm.");
  18.     // LLM初始化也应考虑异步处理
  19.     new Thread(() -> {
  20.         try {
  21.             llm = new MyJavaOpenAIAPI();
  22.             runOnUiThread(() -> {
  23.                 if (llm != null) {
  24.                     Log.i(TAG, "onCreate, llm created ok.");
  25.                 } else {
  26.                     Log.e(TAG, "onCreate, llm created failed.");
  27.                 }
  28.             });
  29.         } catch (Exception e) {
  30.             Log.e(TAG, "LLM initialization failed: " + e.getMessage());
  31.         }
  32.     }).start();

  33.     Log.i(TAG, "onCreate, Before create mIat...");
  34.     mIat = SpeechRecognizer.createRecognizer(this, mInitListener);
  35.     if (mIat == null) {
  36.         showTip("语音识别对象创建失败");
  37.         Log.e(TAG, "SpeechRecognizer creation failed");
  38.     } else {
  39.         Log.i(TAG, "onCreate, After create mIat.");
  40.     }

  41.     mIatDialog = new RecognizerDialog(this, mInitListener);
  42.     mSharedPreferences = getSharedPreferences(IatSettings.PREFER_NAME, Activity.MODE_PRIVATE);
  43.     mResultText = ((EditText) findViewById(R.id.iat_text));
  44. }
复制代码
3. 添加超时机制
为LLM处理添加超时机制:
  1. private void callLlm(String text, String caller) {
  2.     Log.i(TAG, caller + ", " + text + ", before use llm.");
  3.    
  4.     if (llm != null) {
  5.         Log.i(TAG, "llm is not null, continue to llm.MyLlmDeal(text))...");
  6.         
  7.         Thread llmThread = new Thread(new Runnable() {
  8.             @Override
  9.             public void run() {
  10.                 try {
  11.                     String llmResult = llm.MyLlmDeal(text);
  12.                     llmResult = MainActivityKt.wash(llmResult);
  13.                     
  14.                     runOnUiThread(new Runnable() {
  15.                         @Override
  16.                         public void run() {
  17.                             if (llmResult != null) {
  18.                                 Log.i(TAG, "llmResult isn't null.");
  19.                                 mResultText.append(llmResult);
  20.                                 mResultText.setSelection(mResultText.length());
  21.                             }
  22.                         }
  23.                     });
  24.                 } catch (Exception e) {
  25.                     Log.e(TAG, "LLM processing error: " + e.getMessage());
  26.                     runOnUiThread(() -> showTip("LLM处理出错"));
  27.                 }
  28.             }
  29.         });
  30.         
  31.         llmThread.start();
  32.         
  33.         // 添加超时处理(例如10秒超时)
  34.         try {
  35.             llmThread.join(10000); // 等待10秒
  36.             if (llmThread.isAlive()) {
  37.                 llmThread.interrupt();
  38.                 runOnUiThread(() -> showTip("LLM处理超时"));
  39.             }
  40.         } catch (InterruptedException e) {
  41.             Log.e(TAG, "LLM processing interrupted: " + e.getMessage());
  42.         }
  43.     }
  44. }
复制代码
4. 检查权限配置
确保在 AndroidManifest.xml 中添加了必要权限:
  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  3. <uses-permission android:name="android.permission.RECORD_AUDIO" />
复制代码
5. 添加网络状态检查
在调用LLM前检查网络状态:
  1. private boolean isNetworkAvailable() {
  2.     ConnectivityManager connectivityManager =
  3.         (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  4.     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
  5.     return activeNetworkInfo != null && activeNetworkInfo.isConnected();
  6. }

  7. private void callLlm(String text, String caller) {
  8.     Log.i(TAG, caller + ", " + text + ", before use llm.");
  9.    
  10.     if (!isNetworkAvailable()) {
  11.         showTip("网络不可用");
  12.         return;
  13.     }
  14.    
  15.     // 其余代码不变
  16.     // ...
  17. }
复制代码





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-9-18 01:47 , Processed in 0.014169 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表