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
相关产品推荐
相关产品推荐

