You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:06:16