您现在的位置是:首页 > 文章详情

一个对复用view下滑动流畅度优化,图片和内存处理,稳定性都非常强大的android开源框架(beyondPhysics)

日期:2018-08-18点击:409

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的结构直接应用于实际开发......

预览图
1
2
3
4
5
6
7
8
9

框架静态图

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的表现更加优秀

原文链接:https://yq.aliyun.com/articles/626202
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章