刚接触okhttp3,调用PlantNet API结果无法显示在TextView上如何解决?
问题排查与解决步骤
检查基础权限与文件有效性
先确认AndroidManifest.xml中已添加必要权限:<!-- 网络访问权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- Android 12及以下读取外部存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Android 13及以上读取图片权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />同时添加日志判断目标图片是否存在:
Log.d("FileCheck", "文件是否存在:" + file1.exists());如果返回false,说明路径有误或无读取权限,需要先修复文件访问问题。
校验API请求逻辑
你当前代码中的api-key=123为测试占位值,需先替换为PlantNet平台申请的真实有效密钥。
新增响应状态校验,避免接口报错时拿不到有效返回:Response response = client.newCall(request).execute(); // 先判断请求是否成功 if (!response.isSuccessful()) { textView.setText("接口请求错误,状态码:" + response.code()); return; } // response.body().string()只能调用一次,先存储到变量中 String result = response.body().string(); Log.d("APIResult", result); // 先在Logcat中查看是否拿到返回内容 textView.setText(result);可以先在Logcat中过滤APIResult标签,确认是否有内容返回,排除TextView本身显示问题。
替换为规范异步请求逻辑
StrictMode绕过主线程网络限制属于调试用的非常规方案,高版本Android系统可能仍会拦截,且主线程执行耗时网络请求容易触发ANR,建议改为OkHttp自带的异步请求,同时注意UI更新必须在主线程执行:// 把原来的execute()替换为以下异步逻辑 OkHttpClient client = new OkHttpClient(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); // 切回主线程更新UI runOnUiThread(() -> textView.setText("请求失败:" + e.getMessage())); } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); runOnUiThread(() -> textView.setText(result)); } });校验TextView控件有效性
可以先给TextView手动设置测试文本,确认控件本身可以正常显示:textView.setText("测试文本");如果测试文本也无法显示,检查布局文件中TextView的宽高、文字颜色是否和背景冲突、是否被其他控件遮挡。
内容的提问来源于stack exchange,提问作者Carl Angeles
相关产品推荐
相关产品推荐

