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

Android开发中如何通过JSON校验设备本地是否已存在目标文件

安卓猫咪无限轮播应用实现方案

直接按落地步骤拆,所有逻辑用原生API就能实现,不需要额外引入第三方库,完全匹配课业要求。

一、前置配置

  • 先在AndroidManifest.xml声明必要权限:网络权限<uses-permission android:name="android.permission.INTERNET" />,图片缓存直接存在应用私有目录,不需要申请存储权限,省掉高版本适配的麻烦。
  • 轮播组件直接用SDK自带的ViewPager2,JSON解析用内置org.json包,网络请求用HttpURLConnection,图片处理用原生BitmapFactory,不需要额外导依赖。

二、JSON接口请求构造

随机猫图接口的返回一般是JSON数组格式,单条数据包含图片唯一ID、原图下载地址字段,请求按以下步骤写:

  • 所有网络逻辑必须放在子线程执行,Java用ExecutorService开线程池,Kotlin用协程即可,绝对不要在主线程发起网络请求,否则会直接触发NetworkOnMainThreadException崩溃。
  • 初始化HttpURLConnection对象,设置请求方法为GET,连接超时设5000ms,读取超时设10000ms,请求头添加Accept: application/json,明确要求接口返回JSON格式数据。
  • 拿到响应流后用BufferedReader逐行读取拼接成完整响应字符串,直接传入JSONArray(responseStr)解析为数组对象,遍历数组取出每一个JSONObject,分别读取id字段作为图片唯一标识、url字段作为图片下载地址。
  • 加一层异常兜底:如果响应码不是200、JSON解析失败、缺失必要字段,直接跳过本次请求,等下一轮预加载再重新拉取,不要让应用崩溃。

三、基于图片ID的重复文件校验

这部分逻辑非常直接,不需要做复杂的MD5校验,直接用接口返回的唯一ID做文件名即可:

  • 首次启动时在应用私有目录创建固定缓存文件夹:File catCacheDir = new File(getFilesDir(), "cat_cache");,如果文件夹不存在调用mkdirs()创建。
  • 拿到接口返回的图片ID后,直接构造对应本地文件实例:File localFile = new File(catCacheDir, id + ".jpg");,同时判断两个条件:localFile.exists()为true、localFile.length() > 0,两个条件都满足就说明这张图已经下载完成,不需要重复请求,直接读取本地文件解析Bitmap即可。
  • 加个简单的缓存清理逻辑:当缓存文件夹内的图片数量超过20张时,按文件最后修改时间排序,删除最早存入的5张,避免占用过多本地存储,这个细节在课业评分里会是加分项。

四、图片下载与加载优化

  • 校验后如果本地不存在对应文件,就用之前拿到的图片url发起GET请求,拿到响应输入流后通过FileOutputStream写入刚才构造的本地文件,写入完成后及时关闭输入输出流。
  • 解析Bitmap时不要直接把整个文件读入内存,很容易触发OOM:先给BitmapFactory.Options设置inJustDecodeBounds = true,仅读取图片的宽高信息,根据轮播控件的实际宽高计算采样率inSampleSize,再把inJustDecodeBounds设为false,解析出缩放后的Bitmap,内存占用能降到原来的几十分之一。
  • 所有UI更新操作必须切回主线程执行,子线程不能直接修改View或者适配器数据源。

五、无限轮播逻辑实现

  • 给ViewPager2绑定RecyclerView.Adapter,数据源存已经下载完成的本地文件路径或者解析好的Bitmap对象。
  • 无限循环的实现不需要做特殊的数据源拼接:直接让适配器的getItemCount()返回Integer.MAX_VALUE,在onBindViewHolder里计算真实数据位置时用position % 实际图片列表长度取模即可,用户滑动时永远碰不到边界。
  • 自动轮播用主线程Handler实现:每隔3000ms发送一次延时消息,回调里调用viewPager.setCurrentItem(currentItem + 1, true)执行平滑滚动,页面退到后台时要移除所有回调,避免内存泄漏。
  • 加预加载逻辑:当轮播滑动到当前数据源倒数第二张的位置时,提前触发新的接口请求拉取新的猫图,提前完成下载存入缓存,避免滑到末尾出现空白等待。

踩坑提醒:所有流操作必须在finally块里关闭,不要留悬空引用;确定不再使用的Bitmap主动调用recycle()回收内存;不要把整个图片列表的Bitmap一直存在内存里,按需加载、用完回收,否则很容易出现内存溢出崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:57:20