Lottie动画资源放到服务器预下载
创始人
2025-01-16 22:04:55
0

object FileDownloadConstant {
const val filePath = “gifts/zip”
//下载下来的资源存放的根目录
var DEFAULT_FILE_CACHE_PATH = ContextUtils.getApplicationContext().getExternalFilesDir(“gift”).path
//礼物动画存储目录
var rootPathAnimation = “ D E F A U L T F I L E C A C H E P A T H / {DEFAULT_FILE_CACHE_PATH}/ DEFAULTF​ILEC​ACHEP​ATH/{filePath}”

object BaseConfig{
//资源存放的apk地址
const val ANIMATION_OSS_URL = “https://static.network.com”
const val GIFT_PATH = “ A N I M A T I O N O S S U R L / {ANIMATION_OSS_URL}/ ANIMATIONO​SSU​RL/{filePath}”
}

//资源列表
var giftList = listOf(“xiagujian”,“chiji”,“kele”,“banzhuan”,“memeda”,“qiujiaowang”,“qiqiu”,“penghua”,
“yanhua”,“meigui”,“feiji”,“chengbao”,“bixin”,“loveyou”,“sobuteful”,“hongchun”,“girlfri”,“huangguan”,
“leihen”,“qiubite”,“haozhuchi”,“zhuguang”,“langman”,“bidong”,“dangao”,“laohu”,“mao”,“xiong”,“hunsha”,
“dianzan”,“bangbangtang”,“icecream”,“yiwendingqing”,“haidao”,“iphone”,“yecanyuehui”,“lovetree”,“jiarilvxing”)
}

文件下载工具类

/**

  • 文件下载工具类
    */
    object FileDownloadUtil {
    private val parentPath = FileDownloadConstant.rootPathAnimation
    private val fetch = Fetch.getInstance(FetchConfiguration.Builder(ContextUtils.getApplicationContext())
    .setLogger(FetchLogger(true,“动画下载”))
    .enableLogging(true)
    .setDownloadConcurrentLimit(5)
    .setAutoRetryMaxAttempts(3)
    .setHttpDownloader(OkHttpDownloader(Downloader.FileDownloaderType.PARALLEL))
    .setProgressReportingInterval(1000)
    .build())

/**

  • 下载监听
    */
    class DownloadListener(private val groupId : Int,private val num:Int,private val callback 😦(Boolean) -> Unit) ?) : AbstractFetchListener(){
    private var downloaded: Int = 0 //已下载的数量
    override fun onCompleted(download: Download) {
    if (download.group != groupId) {
    return
    }
    //资源打包成zip文件放到了服务器上,所以下载下来要解压缩
    LottieAnimationUtils.unZip(download.file, parentPath)
    downloadCount(true)
    }

override fun onError(download: Download, error: Error, throwable: Throwable?) {
if (download.group != groupId) {
return
}
downloadCount(false)
}

private val downloadCount: (Boolean) -> Unit = {
downloaded++
if (downloaded == num) {
callback?.invoke(it)
fetch.removeListener(this)
}
}
}

fun downloadList(pathList: List, priority: Priority = Priority.NORMAL, callback: ((Boolean) -> Unit)? = null) {
val groupId = Random.nextInt()
pathList.filter {
//本地文件不存在的才下载
!File(parentPath + File.separator + it).exists()
}.flatMap { path ->
arrayListOf(Request(“ F i l e D o w n l o a d C o n s t a n t . B a s e C o n f i g . G I F T P A T H / {FileDownloadConstant.BaseConfig.GIFT_PATH}/ FileDownloadConstant.BaseConfig.GIFTP​ATH/path” + “.zip”, parentPath + “/” + path + “.zip”).also {
it.groupId = groupId
it.priority = priority
})
}.apply {
if (size == 0) {
callback?.invoke(true)
return@apply
}
fetch.addListener(DownloadListener(groupId, size, callback)).enqueue(this)
}
}

/**

  • 下载单个文件
    */
    fun download(path: String, callback: ((Boolean) -> Unit)? = null) {
    if (File(“ p a r e n t P a t h / parentPath/ parentPath/path” + “.zip”).exists()) {
    callback?.invoke(true)
    return
    }
    val groupId = Random.nextInt()
    fetch.addListener(DownloadListener(groupId, 1, callback)).enqueue(Request(“ F i l e D o w n l o a d C o n s t a n t . B a s e C o n f i g . G I F T P A T H / {FileDownloadConstant.BaseConfig.GIFT_PATH}/ FileDownloadConstant.BaseConfig.GIFTP​ATH/path” + “.zip”, “ p a r e n t P a t h / parentPath/ parentPath/path.zip”).also { it.groupId = groupId })
    }
    }

下载框架使用的是一个开源的,名字叫Fetch

在启动页的onCreate方法中,调用:

FileDownloadUtil.INSTANCE.downloadList(FileDownloadConstant.INSTANCE.getGiftList(), Priority.NORMAL,null);

就开始下载资源了

那么怎么使用Lottie框架加载文件夹中的动画资源呢?直接上代码

object LottieAnimationUtils {
//lottie加载本地资源的核心方法
fun loadLottie(lottieAnimationView: LottieAnimationView,imagePath:String,dataPath : String,giftName:String):FileInputStream?{
lottieAnimationView.setCacheComposition(false)
val imageFiles = File(imagePath)
val jsonFile = File(dataPath)
var fis:FileInputStream? = null
//资源中只有json文件的时候走这里
if (!imageFiles.exists()) {
if (jsonFile.exists()) {
fis = FileInputStream(jsonFile)
try {
lottieAnimationView.setImageAssetDelegate(null)
}catch (e : Exception) {

}
LottieComposition.Factory.fromInputStream(fis) {
lottieAnimationView.postDelayed(Runnable {
lottieAnimationView.visibility = View.VISIBLE
},200)
it?.let {
it1 -> lottieAnimationView.setComposition(it1)
}
lottieAnimationView.playAnimation()
}
}else {
FileDownloadUtil.download(giftName)
}
return fis
}
//资源中有imges和json的走这里

结尾

我还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家。
(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

image
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
搜索资料的时间来学习。**

[外链图片转存中…(img-NGrXGGWu-1714771521859)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

相关内容

热门资讯

一分钟内幕!科乐吉林麻将系统发... 一分钟内幕!科乐吉林麻将系统发牌规律,福建大玩家确实真的是有挂,技巧教程(有挂ai代打);所有人都在...
一分钟揭秘!微扑克辅助软件(透... 一分钟揭秘!微扑克辅助软件(透视辅助)确实是有挂(2024已更新)(哔哩哔哩);1、用户打开应用后不...
五分钟发现!广东雀神麻雀怎么赢... 五分钟发现!广东雀神麻雀怎么赢,朋朋棋牌都是是真的有挂,高科技教程(有挂方法)1、广东雀神麻雀怎么赢...
每日必看!人皇大厅吗(透明挂)... 每日必看!人皇大厅吗(透明挂)好像存在有挂(2026已更新)(哔哩哔哩);人皇大厅吗辅助器中分为三种...
重大科普!新华棋牌有挂吗(透视... 重大科普!新华棋牌有挂吗(透视)一直是有挂(2021已更新)(哔哩哔哩)1、完成新华棋牌有挂吗的残局...
二分钟内幕!微信小程序途游辅助... 二分钟内幕!微信小程序途游辅助器,掌中乐游戏中心其实存在有挂,微扑克教程(有挂规律)二分钟内幕!微信...
科技揭秘!jj斗地主系统控牌吗... 科技揭秘!jj斗地主系统控牌吗(透视)本来真的是有挂(2025已更新)(哔哩哔哩)1、科技揭秘!jj...
1分钟普及!哈灵麻将攻略小,微... 1分钟普及!哈灵麻将攻略小,微信小程序十三张好像存在有挂,规律教程(有挂技巧)哈灵麻将攻略小是一种具...
9分钟教程!科乐麻将有挂吗,传... 9分钟教程!科乐麻将有挂吗,传送屋高防版辅助(总是存在有挂)1、完成传送屋高防版辅助透视辅助安装,帮...
每日必看教程!兴动游戏辅助器下... 每日必看教程!兴动游戏辅助器下载(辅助)真是真的有挂(2025已更新)(哔哩哔哩)1、打开软件启动之...