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

Android TV模拟器运行Slideshow代码仅显示加载动画无响应

Android TV猫咪幻灯片应用加载异常排查指引

你代码里存在多个逻辑疏漏,按优先级排查修复即可:

  • 最基础的执行缺失:你仅在onCreate里定义了CatImages这个AsyncTask子类,从未实例化调用execute()启动任务,后台拉取逻辑根本没有运行,界面自然一直停留在初始加载状态。
  • 接口调用逻辑完全错误:
    1. 你请求的https://cataas.com/cat?json=true接口返回的是包含图片id、url字段的JSON数据,不会直接返回图片二进制流,不能直接拿这个接口的输入流解码Bitmap
    2. 你已经把接口返回的response输入流通过BufferedReader读完、转成JSON字符串了,流指针已经移动到末尾,后续再调用BitmapFactory.decodeStream(response)必然返回null,根本拿不到图片
  • 去重逻辑完全失效:第一次运行时ids列表是空的,遍历ids的for循环不会执行任何代码,图片下载、本地保存、id入库的逻辑第一次启动就进不去,永远不会生成可展示的图片文件。且现有循环判断逻辑只要列表里存在一个不匹配的id就会重复触发下载,逻辑完全错误。
  • 缺少必要配置:确认AndroidManifest.xml中已经添加网络权限声明:
    <uses-permission android:name="android.permission.INTERNET" />
    
    同时确认TV模拟器本身可以正常访问外网,部分模拟器默认网络配置存在限制。
  • 轮播逻辑缺陷:你在doInBackground里写的while(on==true)死循环没有正确的循环调度,第一次请求如果触发异常直接return就会终止整个任务,根本实现不了幻灯片轮播效果;另外就算图片加载成功,你也没有写隐藏进度条ProgressBar的逻辑,加载状态会一直覆盖在界面上。

核心逻辑修复参考

先把AsyncTask泛型调整为AsyncTask<String, String, String>适配参数传递,再替换对应逻辑片段:

// 1. 在onCreate方法末尾添加任务启动代码
new CatImages().execute();

// 2. 修正doInBackground请求逻辑
@Override
protected String doInBackground(String... strings) {
    while (on) {
        HttpURLConnection urlConnection = null;
        try {
            // 先请求JSON接口拿到图片ID
            URL jsonUrl = new URL("https://cataas.com/cat?json=true");
            urlConnection = (HttpURLConnection) jsonUrl.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();

            BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            StringBuilder builder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }
            JSONObject jsonRes = new JSONObject(builder.toString());
            String catId = jsonRes.getString("id");
            urlConnection.disconnect();

            // 跳过已加载过的重复图片
            if (ids.contains(catId)) {
                Thread.sleep(3000);
                continue;
            }

            // 单独请求对应ID的图片二进制资源
            URL imgUrl = new URL("https://cataas.com/cat/" + catId);
            urlConnection = (HttpURLConnection) imgUrl.openConnection();
            urlConnection.connect();
            Bitmap catBitmap = BitmapFactory.decodeStream(urlConnection.getInputStream());

            // 图片保存到本地
            File imgFile = new File(directory, catId + ".jpg");
            FileOutputStream fos = new FileOutputStream(imgFile);
            catBitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
            fos.flush();
            fos.close();
            ids.add(catId);

            // 传递当前图片ID到UI线程更新界面
            publishProgress(catId);

            // 轮播间隔3秒
            Thread.sleep(3000);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (urlConnection != null) urlConnection.disconnect();
        }
    }
    return null;
}

// 3. 修正UI更新逻辑
@Override
protected void onProgressUpdate(String... values) {
    super.onProgressUpdate(values);
    String currentId = values[0];
    File imgFile = new File(directory, currentId + ".jpg");
    if (imgFile.exists()) {
        Bitmap showBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
        imageView.setImageBitmap(showBitmap);
        // 图片加载完成后隐藏进度条
        progressBar.setVisibility(View.GONE);
    }
}

注意:AsyncTask在Android API 30及以上版本已经被废弃,课程作业如果允许的话后续可以替换为Executor+Handler或者协程实现,兼容性更好。

内容的提问来源于stack exchange,提问作者ReginaldRey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:30:50