GPT-3 Android Studio(JAVA)项目:点击生成按钮应用崩溃无输出
问题分析与解决方案
核心崩溃原因及修复点
主线程执行网络请求
Android严格禁止在主线程执行网络操作,你代码里的service.createCompletion是同步网络调用,直接在点击事件中执行会触发NetworkOnMainThreadException,导致应用崩溃。必须将网络请求放到子线程执行,再回到主线程更新UI。空指针与数组越界风险
当请求失败、无返回结果时,storyArray会是空的,调用storyArray.get(0)会抛出IndexOutOfBoundsException。需要先判断数组是否为空再操作。Token获取方式问题
Android中System.getenv("OPENAI_TOKEN")通常无法正确读取环境变量,建议通过安全方式配置Token,比如gradle.properties读取(避免硬编码提交到公开仓库)。
修复后的代码示例
search = findViewById(R.id.search); resultTextView = findViewById(R.id.resultTextView); generateButton = findViewById(R.id.generateButton); generateButton.setOnClickListener(this::onClick); } private void onClick(View view) { String searchText = search.getText().toString(); // 建议通过gradle.properties读取Token,此处为示例写法 String token = "你的OPENAI_TOKEN"; OpenAiService service = new OpenAiService(token); CompletionRequest completionRequest = CompletionRequest.builder() .prompt(searchText) .temperature(0.7) .maxTokens(96) .topP(1.0) .frequencyPenalty(0.0) .presencePenalty(0.3) .echo(true) .build(); // 子线程执行网络请求 new Thread(() -> { try { CompletionResult result = service.createCompletion("davinci", completionRequest); List<CompletionChoice> storyList = result.getChoices(); // 回到主线程更新UI runOnUiThread(() -> { if (!storyList.isEmpty()) { resultTextView.setText(storyList.get(0).getText()); } else { resultTextView.setText("未获取到有效结果"); } }); } catch (Exception e) { e.printStackTrace(); runOnUiThread(() -> { resultTextView.setText("请求失败:" + e.getMessage()); }); } }).start(); }
额外注意事项
- 确保在
AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
- 安全管理Token:在gradle.properties中添加
OPENAI_TOKEN=你的token,并在app/build.gradle中配置:
android { buildTypes { release { buildConfigField "String", "OPENAI_TOKEN", "\"${OPENAI_TOKEN}\"" } debug { buildConfigField "String", "OPENAI_TOKEN", "\"${OPENAI_TOKEN}\"" } } }
之后代码中用BuildConfig.OPENAI_TOKEN获取Token,避免硬编码泄露。
内容的提问来源于stack exchange,提问作者Kumar Nishant
相关产品推荐
相关产品推荐

