腾讯出品Pag动画框架在Android端的使用-网络Pag加载

这篇具有很好参考价值的文章主要介绍了腾讯出品Pag动画框架在Android端的使用-网络Pag加载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在我们可以通过assets的方式加在pag文件之后,我们会考虑下一个问题,可不可以用Pag框架加载网络文件?

为什么会有这样的问题出现,或者说网络方式加载可以解决什么问题?

  1. APK 体积增加问题

当一个项目规模比较大的时候,会做很多优化工作,其中「APK瘦身」便是一项优化点。通过网络的方式加载可以减少内置文件,从而降低APK大小。

  1. 热更新问题

我们有时候是有这样的需求的,线上更改动画效果,通过网络方式便可以做到。

  1. 新的功能或者组件上线,需要更新客户端问题。

在某些功能中,比如我们现有的图片列表类的,只要线上的api返回新的图片地址即可;那么对于pag,我们也想要有这样的效果。

and more……

有了以上的问题,我们决定做「网络加载Pag」功能!

一、做网络加载Pag需要考虑什么?(其实是所有的网络加载需要考虑的事情)

1、下载器

网络加载的第一步肯定是下载,那么选择一个合适的下载器是十分重要的,这个下载器最好支持什么功能?

  1. 多线程下载(同时需要服务端支持,下载时可指定range)

  2. 断点续传

  3. 通用性(其他位置也可以)

  4. 任务队列(任务优先级等)

  5. 暂停、继续

  6. 下载失败文件处理

2、缓存策略

我们熟知的缓存策略可能就是Glide中的图片三级缓存策略了。其实不止图片,所有的缓存策略基本上就是这三级:

1、 内存缓存

2、磁盘缓存

3、网络(严格意义上来讲,这不算是个缓存)

既然是缓存,就需要考虑缓存的清理策略。我们熟知有的LruCache、DiskLruCache。根据项目的实际情况选择即可。

3、文件校验

为什么需要文件校验,其实有很多原因。但大多数无外乎以下几种:

  1. 文件完整性。我们加载损坏的文件,肯定是展示不出内容的。除非只损换了padding,也就是字节填充部分的内容

  2. 文件安全性。我们的文件如果中途被人篡改,我们可以通过此种方式来校验安全性。当然安全性校验一般会通过MD5、SHA256等哈希算法进行校验,会增加读取文件耗时。

  3. 文件校验失败后的重新下载。一般文件校验失败了,也就证明当前缓存是有问题的,或者中间被人篡改了。这时根据当前文件是缓存还是直接下载的文件,去做对应的处理。如果是缓存文件,会直接删除重新下载,如果非缓存文件,可能提示出错等。

二、Pag文件网络加载具体怎么做?

先说明:如果你使用的是4.3.3版本(包含)后的pag,它的sdk已经内置了网络加载功能,可以直接指定一个url地址的。

当然如果你的项目中需要统一处理缓存,统一下载,或者已经有了成熟的下载器框架。就需要自己搭建一个Pag网络加载方案了。

1、使用Glide加载?

我第一步的考虑是能否通过扩展Glide来增加对Pag文件的支持,为什么会这么考虑,因为Glide已经支持了三级缓存功能,我没必要再实现一次。Glide也有下载功能,我没有必要再实现一次。

我也去网上查了,确实有这样的方案的。但是后来我没采用。原因有下:

  1. 新的Pag文件缓存会占用Glide中配置的缓存空间大小,会影响原本图片缓存。

  2. 项目内部已经有了针对项目的缓存策略,如果使用Glide会打乱原有非图片文件的缓存策略,不方便统一管理。

  3. 现有的下载器,支持多线程下载,可以提升大文件下载速度。

2、新创建加载Pag框架。

后面还是决定自己Pag。基本的流程是这样。

  1. 根据Url的MD5判断本地是否有缓存。

  2. 有缓存

    1. 校验缓存是否完整(没有做安全性校验,因为这个动画文件,感觉没必要)。自己根据Pag文件的格式写了一个校验工具。(后来发现没卵用,给删除了)

    2. 若完整,直接加载

    3. 若加载失败,重新下载。

  3. 无缓存

    1. 下载器下载

    2. 下载成功后,PagFile.load()。

打完收工,基本上我测试了一下没啥问题。

源码就不上了,只要是思路比较重要。

遇到的问题

我不是自己写了个校验工具,我为啥写了个校验工具呢?因为我调用PagFile.load方法发现,返回的是非空的类型(它的代码中没有标记@NonNull),于是我认为即使它加载错了,也会返回一个非空对象,那我何不自己先校验一下。于是翻Pag的源码,根据它内部的校验规则,我先提前一步校验了。

结果问题出现了,有一个损坏了的文件,通过了我的校验工具检验,但是没加载出来,并在Log中看到了 Invild File。

后来我发现,因为PagFile的代码是java代码,而且没有被@Nonnull标记,而我们项目中用的是Kotlin,这样会导致一个什么问题,Kotlin认为该文件是非空的。

于是查阅pag源码,发现在C层的代码里,当加载文件失败时(这个过程会走文件校验),会直接返回一个nullptr,也就是空指针。于是我将自己的校验工具去掉了,直接判断Load的结果,如果是空则证明加载失败了,而加载失败的最大可能就是,文件错了,此时走重新下载,或者其他处理即可。

伪代码:文章来源地址https://www.toymoban.com/news/detail-643990.html


val result = PAGFile.Load(file.path) 
if (result == null) { downloadIt() } 
else { pagView.componsition = result }



到了这里,关于腾讯出品Pag动画框架在Android端的使用-网络Pag加载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓开发面试问题回答技巧,腾讯竟然又偷偷开源了一套Android原生UI框架

    偶然看到知乎的内推帖,投了个简历,下午hr姐姐call我,安排面试选在3天后,然而又要笔试阿里,所以没怎么复习。 8点起床,9点过比较紧张的去了创业园,感觉知乎氛围很好,在那等了一小会,有前台大叔给你倒水。 应该是个参加工作不久的研究僧师兄,出了一道算法题

    2024年03月12日
    浏览(50)
  • 《TCP/IP网络编程》阅读笔记--并发多进程服务端的使用

    目录 1--并发服务器端 2--进程 2-1--进程的相关概念 2-2--fork()创建进程 2-3--僵尸进程 2-4--wait()和waitpid()销毁僵尸进程 3--信号处理 3-1--signal()函数 3-2--sigaction()函数 3--3--利用信号处理技术消灭僵尸进程 4--基于多任务的并发服务器 5--分割 TCP 的 I/O 程序 并发服务器端主要有以下三类

    2024年02月09日
    浏览(28)
  • Android 使用motion 动画如何使用

    MotionLayout 是 Android 中的一个强大的布局容器,它可以用来创建复杂的动画和过渡效果,允许你在布局中定义多个状态,并在这些状态之间进行平滑的动画过渡。以下是使用 MotionLayout 创建动画的基本步骤: 1. 添加依赖: 首先,确保在你的 app 模块的 build.gradle 文件中添加以下

    2024年02月09日
    浏览(29)
  • Android 动画 Lottie 如何使用

    一、简介 Lottie 是Airbnb开源的一个面向 iOS、Android、React Native 的动画库,能分析 Adobe After Effects 导出的动画,并且能让原生 App 像使用静态素材一样使用这些动画,完美实现动画效果。 1.让设计师使用Adobe 的 After Effects(简称 AE)工具(美工一般都会这个)制作这个动画。 2.在AE中安

    2024年04月26日
    浏览(30)
  • Android View动画之LayoutAnimation的使用

    接前篇 Android View动画整理 ,本篇介绍 LayoutAnimation 的使用。 参考《安卓开发艺术探索》。 View 动画作用于 View 。 LayoutAnimation 则作用于 ViewGroup , 为 ViewGoup 指定一个动画,ViewGoup 的子 View 出场时就具体动画效果。 简言之,LayoutAnimation 是为 ViewGroup 的子View指定出场动画。 开

    2024年02月11日
    浏览(30)
  • 【Tars-go】腾讯微服务框架学习使用02-- http 服务

    官方文档说http这里是在net/http原生包的基础上做了修改。 官方给的案例: 可以看到 在初始化了 TarsHttpMux , 再将 TarsHttpMux 注册到tars框架中作为servant就可以启动http服务。 TarsHttpMux 是什么: 可以看出 TarsHttpMux 确实就只是对 http.ServeMux 做了个包装加入了 Conf 并加入了上报状态信

    2024年04月16日
    浏览(31)
  • 【Tars-go】腾讯微服务框架学习使用01--初始化服务

    按照官网描述 go get 安装框架依赖 Tasgo: 官方仓库: TarsCloud/TarsGo: A high performance microservice framework in golang. A linux foundation project. (github.com) 其中有很多exapmle看一看 使用命令创建服务 我的go版本: 1.21.4 TarsGo/tars/tools/tarsgo/README_ZH.md at master · TarsCloud/TarsGo (github.com) 使用tarsgo命令:

    2024年04月15日
    浏览(28)
  • [Android]网络框架之OkHttp(详细)(kotlin)

    目录 OkHttp的介绍 添加依赖 OkHttp的使用 get的同步与异步请求 post的同步与异步请求 POST请求的数据格式 POST请求上传文件 POST请求上传json对象 POST请求上传多个数据 OkHttp的配置 1.Builder构建器 2.自定义拦截器 3.自定义缓存 4. 自定义Cookie https://square.github.io/okhttp/ 由Square公司贡献的

    2024年02月12日
    浏览(73)
  • Confluence使用教程-不古出品

    Confluence支持在一个地方创建、协作和组织所有工作。Confluence是一个团队工作区,知识和协作在此交汇。动态页面为您的团队提供了创建、捕获和协作任何项。 Confluence支持在一个地方创建、协作和组织所有工作。Confluence是一个团队工作区,知识和协作在此交汇。动态页面为

    2023年04月20日
    浏览(59)
  • 基于Android的手机新闻客户端的设计与开发

    摘要: 随着手机的普及,人们获取与保存信息的方式已经发生了彻底的转变。智能手机已经融入了我们的生活,并影响和改变着我们每个人的生活。由于现在各种各样智能手机的普及,使得人们在管理、生活及服务等各个领域使用数据变得更加简洁,更加方便,大大提高了人

    2024年02月02日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包