一个对复用view下滑动流畅度优化,图片和内存处理,稳定性都非常强大的android开源框架(beyondPhysics)
github开源地址https://github.com/xihuan22d/BeyondPhysics
你的收藏是作者前进的动力哦,欢迎在github留星哦, 欢迎阿里的大牛们给予宝贵的意见...
框架demo下载地址: http://47.97.113.47:4126/apks/beyondPhysics.apk
相比其他开源框架的优点:
1.对第三方库无依赖,统一普通请求、图片请求三级缓存(支持gif)、下载、断点下载、上传请求,使得开发的软件不再是各种不同来源的开源框架糅合而成(网络框架,图片框架等等,可减少不必要的性能开销和缩小apk体积,开发一般的android软件apk可以很容易的控制在3m到4m之间),且这5类请求是以继承和泛型方式实现的,从而使得可以被进一步继承达到自定义
2.使用其他开源框架不曾设想过的特殊请求分发处理架构,请求核心处理层使用LinkedHasMap替代BlockingQueue完成队列,使得请求可以被更良好的移除和管理(这样可以非常方便的立即移除无效请求和实现相同图片请求key的请求回调等),当然为了解决LinkedHasMap的缺陷,可以选择启用分发层,对流畅度要求高的部分请求通过分发层分发请求(由分发线程处理核心处理层),以便应对流畅度要求极高的场景(如图片滑动过程,下载列表获取下一页的下载进度),分发层使用BlockingQueue使得可以最大程度的和主线程脱关联,使用该分发架构不但可保证主线程的绝对流畅性,还保留了核心处理层使用LinkedHasMap所带来的各种优势,以及使得核心处理层的容器变得高度的面向对象
3.对内存严格的要求,通过大量的内存调试,保证框架极低的内存占用,图片下载完毕会通过缩放到指定大小获取,即使下载的是大图也不会导致OutOfMemory的出现,处理了所有可能出现内存泄漏的场景,主线程无论以何种方式取消请求,该请求即可立即释放对activity的引用不存在内存泄漏
4.可高度自定义的接口实现的HttpAgreement,BitmapMemoryCache,BitmapDiskCacheAnalyze,对于HttpAgreement框架提供了俩种默认实现,系统的HttpURLConnection实现和OKhttp的实现(对于https请求默认验证系统证书,若想保证https的高度安全,可使用框架内提供的单证书和多证书验证方法),也可自定义选择适合自己的http方式
5.良好封装的recyclerView,使得对于recyclerView的开发变得非常的方便和高效,即便开发如多级评论这类复杂的复用模型也可以非常简便
6.提供阻塞方式取消请求和关闭线程池(该功能一般用于极限测试和极少数特殊场景使用)
7.高度面向对象,严格的编码命名风格和异常日志记录
8.作者花了大量的时间和心血验证调试这个框架,并提供了完整的demo,利用demo便可以非常方便的理解使用该框架,demo部分本身的结构便是一种非常可靠高效的开发模型,可用demo的结构直接应用于实际开发......
预览图
框架静态图
https://github.com/xihuan22d/BeyondPhysics/raw/master/screenshot/beyondPhysics.png
androidStudio Gradle导入:
先添加jitpack仓库:
allprojects { repositories { maven { url 'https://www.jitpack.io' } } }
接着导入项目依赖库即可:
dependencies { implementation 'com.github.xihuan22d:BeyondPhysics:1.0' }
1.发起一个普通post请求
StringRequest_Default stringRequest = new StringRequest_Default(url, Request.POST, baseActivity.activityKey, new Request.OnResponseListener<String>() { @Override public void onSuccessResponse(String response) { } @Override public void onErrorResponse(String error) { } }) { @Override public Map<String, String> getBodyParams() { Map<String, String> bodyParams = new HashMap<String, String>(); return bodyParams; } }; BeyondPhysicsManager.getInstance(baseActivity).addRequestWithSort(stringRequest);
建议所有的activity继承于框架内的BaseActivity,并且tag使用baseActivity.activityKey,可以保证activity销毁后请求不存在内存泄露问题,立即能释放请求占用的引用,避免短时间的内存泄露问题
2.发起一个普通图片请求
<com.beyondphysics.ui.views.NetworkImageView android:layout_width="wrap_content" android:layout_height="wrap_content" /> //获得圆角图片(将在线程内执行圆角转换,保证主线程的流畅性) <com.beyondphysics.ui.views.RoundedNetworkImageView android:layout_width="wrap_content" android:layout_height="wrap_content" app:circleBorderColor="#ffffff" app:circleBorderWidth="1dp" app:roundedType="circleBorder" /> NetworkImageViewHelp.getImageFromNetwork(NetworkImageView networkImageView, String urlString, String tag, int width, int height, int defaultResId, int errorResId);
建议对width和height进行计算后传入,这样对于图片的处理可以做到有多大取多大,可以大大减少图片的内存开销和图片解码过程的内存峰值,tag建议使用baseActivity.activityKey,可以保证activity销毁后请求不存在内存泄露问题,立即能释放请求占用的引用,避免短时间的内存泄露问题
3.发起一个gif图片请求(包含NetworkImageView的所有功能,相比NetworkImageView,NetworkGifImageView的实现更为复杂,如果明确不包含gif或者只需要解析gif的第一张图片建议使用NetworkImageView获得更优的性能)
xml布局加入
<com.beyondphysics.ui.views.NetworkGifImageView android:layout_width="wrap_content" android:layout_height="wrap_content" /> //获得圆角图片(将在线程内执行圆角转换,保证主线程的流畅性) <com.beyondphysics.ui.views.RoundedNetworkGifImageView android:layout_width="wrap_content" android:layout_height="wrap_content" app:circleBorderColor="#ffffff" app:circleBorderWidth="1dp" app:roundedType="circleBorder" /> NetworkGifImageViewHelp.getImageFromNetwork(NetworkGifImageView networkGifImageView, String urlString, String tag, int width, int height, int defaultResId, int errorResId);
4.下载和断点下载请求
BreakpointDownloadRequest<?> breakpointDownloadRequest = new BreakpointDownloadRequest_Default(url, savePath, -1, activityKey, new Request.OnResponseListener<String>() { @Override public void onSuccessResponse(String response) { } @Override public void onErrorResponse(String error) { } }, 9, null, 8000, 22000, new BreakpointDownloadRequest.OnDownloadProgressListener() { @Override public void maxProgress(BreakpointDownloadRequest<?> breakpointDownloadRequest, int totalSize) { } @Override public void updateProgress(BreakpointDownloadRequest<?> breakpointDownloadRequest, int currentSize, int totalSize) { } }); breakpointDownloadRequest.setReceiveCancel(true); BeyondPhysicsManager.getInstance(BreakpointDownloadActivity.this).addRequest(breakpointDownloadRequest);
5.上传请求
UploadRequest_Default_Params uploadRequest_Default_Params = new UploadRequest_Default_Params(); uploadRequest_Default_Params.setUrlString(url); uploadRequest_Default_Params.setNames(names); uploadRequest_Default_Params.setValues(values); uploadRequest_Default_Params.setFileNames(fileNames); uploadRequest_Default_Params.setFilePaths(filePaths); uploadRequest_Default_Params.setTag(baseActivity.activityKey); uploadRequest_Default_Params.setOnResponseListener(new Request.OnResponseListener<String>() { @Override public void onSuccessResponse(String response) { } @Override public void onErrorResponse(String error) { } }); uploadRequest_Default_Params.setOnUploadProgressListener(onUploadProgressListener); UploadRequest_Default uploadRequest = new UploadRequest_Default(uploadRequest_Default_Params); uploadRequest.setReceiveCancel(true); BeyondPhysicsManager.getInstance(baseActivity).addRequestWithSort(uploadRequest);
6.可以非常方便的使用自定义证书的https
如:
public class HttpConnectTool { public static synchronized SSLSocketFactory getInstanceSslSocketFactory(Context context) { if (sslSocketFactory == null) { List<String> crts = new ArrayList<String>(); crts.add("my.crt"); crts.add("my1.crt"); sslSocketFactory = SSLSocketTool.getSocketFactoryByKeyStore(SSLSocketTool.TYPE_ASSETS, crts, context); } return sslSocketFactory; } } stringRequest.setOnHttpStatusListener(new OnHttpStatusListener() { @Override public void onHttpInit(HttpURLConnection httpURLConnection, Object object) { } @Override public void onHttpsInit(HttpsURLConnection httpsURLConnection, Object object) { if (httpsURLConnection != null) { httpsURLConnection.setSSLSocketFactory(HttpConnectTool.getInstanceSslSocketFactory(TheApplication.getTheApplication())); } } @Override public void onHttpCompleted(HttpURLConnection httpURLConnection, Object object) { } @Override public void onHttpsCompleted(HttpsURLConnection httpsURLConnection, Object object) { } });
末言:
介绍了框架内网络请求部分的简单使用教程,以上功能在demo里面均有对应的写法可参考,详细了解框架的使用流程可参照demo,总体而言,这个框架对于内存泄露溢出,和流畅度的优化还是非常强大的,诸如微信朋友圈这种对流畅度要求很高的图片结构甚至比glide的表现更加优秀
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android中的设计模式之责任链模式
参考 《设计模式:可复用面向对象软件的基础 》5.1 Chain of responsibility 职责链 对象行为型模式 《Android源码设计模式解析与实战》第9章 使编程更有灵活性--责任链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 适用场景 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。 想在不明确指定接收者的情况下,像多个对象中的一个提交一个请求。 可处理一个请求的对象集合应被动态指定。 结构 结构 Handler 抽象处理角色,声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用。 ConcreteHandler 具体处理者角色,对请求进行处理,如果不能处理则将该请求转发给下一个节点上的处理对象。 进一步抽象 对于请求来说,其形式是固定的,就是一个字符串,而判断一个节点上的对象是否能够处理该请求的标志,则是该字符串是否与之匹配。然而在大多数情况下,责任链中的请求和对应的处理规则是不尽相同的,在这种情况下可以将请...
- 下一篇
Fluwx:微信SDK在Flutter上的实现
前言 随着 Flutter越来越火热,我相信越来越多的小伙伴都跃跃欲试。但是一个很重要的问题是,很多第三方 SDK,如微信SDK,都无法在Flutter上直接使用。所以,我这几天开发了一个微信SDK的插件,希望能够一定程度上帮助到大家。 Fluwx要做什么 分享 登录 支付 这是Fluwx的目标。现在Fluwx仍在开发阶段,android分享部分已经完成,ios部分还在持续开发。如果你想也成为Fluwx的开发者,可以给我留言。 需要准备的 使用Fluwx之前,强烈建议先阅读微信SDK官方文档, 这有助于你使用Fluwx。Fluwx的api字段名称基本和官方的字段名称是一致的。 引入 在pubspec.yaml文件中添加如下代码: dependencies: fluwx: ^0.0.1 初始化 Fluwx.registerApp(RegisterModel(appId: "your app id", doOnAndroid: true, doOnIOS: true)); appId:在微信平台申请的appId。 doOnAndroid:是否在android平台上执行此操作。 doOnIO...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8