Android TV模拟器运行Slideshow代码仅显示加载动画无响应
Android TV猫咪幻灯片应用加载异常排查指引
你代码里存在多个逻辑疏漏,按优先级排查修复即可:
- 最基础的执行缺失:你仅在
onCreate里定义了CatImages这个AsyncTask子类,从未实例化调用execute()启动任务,后台拉取逻辑根本没有运行,界面自然一直停留在初始加载状态。 - 接口调用逻辑完全错误:
- 你请求的
https://cataas.com/cat?json=true接口返回的是包含图片id、url字段的JSON数据,不会直接返回图片二进制流,不能直接拿这个接口的输入流解码Bitmap - 你已经把接口返回的
response输入流通过BufferedReader读完、转成JSON字符串了,流指针已经移动到末尾,后续再调用BitmapFactory.decodeStream(response)必然返回null,根本拿不到图片
- 你请求的
- 去重逻辑完全失效:第一次运行时
ids列表是空的,遍历ids的for循环不会执行任何代码,图片下载、本地保存、id入库的逻辑第一次启动就进不去,永远不会生成可展示的图片文件。且现有循环判断逻辑只要列表里存在一个不匹配的id就会重复触发下载,逻辑完全错误。 - 缺少必要配置:确认
AndroidManifest.xml中已经添加网络权限声明:
同时确认TV模拟器本身可以正常访问外网,部分模拟器默认网络配置存在限制。<uses-permission android:name="android.permission.INTERNET" /> - 轮播逻辑缺陷:你在
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
相关产品推荐
相关产品推荐

