0°

打造急速开发框架FastApp

内容预览:
  • 在前面的文章中,我们介绍了开发过程容易出现的一些问题,今天我们就在...~
  • 补:目前国内很多大神也在这些项目智商二次封装了很多使用的库,比如NoH...~
  • (我在一些群里曾听到一些开发者说“ImageLoader不行啊,经常造成内存溢...~

始发于微信公众号: 程序员小乐

分享编程技能、互联网技术、生活感悟、打造干货分享平台,将总结的技术、心得、经验分享给大家,这里不只限于技术!学无止境,不求尽如人意,但求问心无愧。让学习成为一种美、一种习惯。值得爱学习的你去关注,感觉有帮助转发分享让更多的人去关注!点击上方 蓝字 关注!



作者:江湖人称小白哥

链接: http://blog.csdn.net/dd864140130/article/details/52809823
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

打造急速开发框架FastApp—– 由   分享

每日英语

No matter how bad your life may seem in the moment, it will always get better.

哪怕此刻的生活有多糟糕,也总会有好转的一天。


本年度最后一个长假算是过去了,再度回到北京,颇有一番感受。

在前面的文章中,我们介绍了开发过程容易出现的一些问题,今天我们就在此基础上打造自己急速开发框架(FastApp)。该框架旨在向你展示一个轻量级的应用的总体结构以及如何构建多Fragment应用,为了使他对所有的开发者都比较友好,我们返本溯源,暂时避开的MVP及MVVM,而是继续沿用MVC设计理念。当然,你可能会问这时候还用MVC,是不是太落后了?关于这点,后面我会单独的写一篇文章来介绍所谓的MVC、MVP、MVVM在移动应用开发中遇到的问题。此后,我们将以该框架为例,来向大家展示一些性能优化技巧以及向你展示一个项目如何由小变大(如何插件化,如何组件化,如何构建CI等),又是如何做技术选型的。此外,为了更好的帮助大家学习RxJava和Retrofit,我特地将其纳入到基础结构中。

FastApp是什么?



FastApp是一个轻量级急速开发框架,基于Fragment+RxJava+Retrofit 2.0+Glide+Realm构建,采用Material Design设计风格,帮助开发者快速构建轻量级应用。


为什么采用多Fragment构建应用?



相比Activity,Fragment稍显复杂。谈起Fragment的时候,很多开发者直接摆手,然后告诉你这玩意坑太多,比如说调试比较困难,无法有效的实现业务逻辑和View的解耦,偶尔的NullPointerException问题等等。但这些问题都不是阻止我们使用Fragment的原因。其实深究下来,你会发现这并不是Fragment自身的问题,而更多的是由于Fragment稍显复杂,导致很多开发者没有耐心去深究它,再加上一些开发者喜欢直接copy网上的代码,不加以思考的就应用在实际项目中,后果可想而知。有很多人也提出过通过自定义View的方式取代Fragment,当然这也是可行的,但是对于大部分开发者来说,这好像没有必要(你不是在加班,就是在吃饭…你懂的)

那么这里我为什么要采用多Fragment构建基础框架呢?主要有有两方面的原因:

1.相比创建Actvity,Fragment要显得更加轻量级。尤其是在同一个Activity中实现多种布局的时候,无需新建Activity,另外,由于Fragment可以被缓存,因此在某些场景下会有更流畅的体验。 
2. Fragment能让你更容易的适配手机和平板。如果你的应用需要支持这两种类型的设备,那么使用Fragment会帮你减少很多适配问题。 
3. 最大程度上的实现布局复用,更好的实现模块化。很多情况下,你会发现:你在用玩“积木”的方法拼装应用。

而你所付出的代价仅仅需要花费点事件研究它。在FastApp当中,我们已经为你了一部分工作,在大多数情况下,它工作良好。你需要做的就是关注界面的实现和业务逻辑。


为什么采用RxJava+Retrofit?



在11年左右的时候,没有太多网络库供你选择,所以在一些比较老的项目当中还会看到我们使用HttpUrlConnection或者HttpClient来自行封装成的请求库。5年的时间,让Android整个生态环境更加晚上,越来越多人参与到Android的开发工作,也诞生了很多非常优秀的网络库,如async-http-client,volley,OkHttpClient,Retrofit等等,这些库各有利弊,但是就目前看来相对比较通用又受大家欢迎的莫过于volley,OkHttpclent和Retrofit这三者了。而Retrofit是通过包装OKHttpClient而来,所以说两者在底层并无多大区别,而volley则是google前几年推出的。在我看来,在你的应用无特殊要求的情况下,三者之一都能满足需求,而且在出现问题的时候能快速的从周围开发者得到反馈。

这里我选择了Retrofit来做出基础网络请求,另外也应时的结合RxJava来帮助大家更好的学习。

补:目前国内很多大神也在这些项目智商二次封装了很多使用的库,比如NoHttp,xUtils,OkHttpUtils,OkGo等,也有很多一些从头开发的,如HttpLite等。但无论你选择哪一个,本质并无变化。不过,如果你想深入底层学习,开始时请尽可能的不要使用,封装程度太高,学到的越少。后期有经验之后,自己尝试造轮子呗。


为什么采用Glide?



目前网络加载框架也是繁多,目前常用的有以下几种:ImageLoader(2011年),Picasso(2013年),Glide(2012年),Fresco(2015年)四种。其中ImageLoader出现的最早也应用的最为广泛。早期出现的ImageLoader首要关注的是如何尽快的加载图片,然后需要自己动手处理图片防止内存溢出。后面,大家觉得很烦啊,于是一些即注重加载速度,又减少内存溢出的网络加载框架就出现了,就像后三种。(我在一些群里曾听到一些开发者说“ImageLoader不行啊,经常造成内存溢出啊,Fresco就不会,所以ImageLoader已经过时了”之类的话,虽然我个人能力也比较一般,但是当遇到问题的时候我首先想的是“我是不是忘记处理什么?是不是我的能力有问题,而不是质疑框架,毕竟框架是死的,人是活的”)

这些加载库各有优缺点,需要自行调研之后根据业务选择,这里我选择了加载速度较快,体积更小的Glide作为网络加载库。

这里我们对ImageLoader,Glide、Picasso、Fresco做个简单的对比: 
ImageLoader虽然已经停止维护了,但是仍然比较好用,图片加载不多的场景下推荐使用。

GlidePicasso基础上二次开发而来,沿袭了Picasso以往的简洁风格,并做了大量优化。

Glide Vs Picasso Glide Picasso
图片格式 默认RGB_565,支持动态图 默认RGB_ARGB_8888,不支持动态图
内存占用 默认情况下比Picasso小一半
磁盘缓存 根据ImageView的大小来缓存相应的图片 只缓存原始尺寸的图片
包体积 比Picasso大
加载速度 大部分情况下比Picasso快

Fresco重点关注图片加载导致的内存溢出问题。和传统做法不一致,Fresco将图片资源放在虚拟机管理内存之外的Native堆当中,因此该部分内存不占用App内存。但是由于虚拟机无法管理该区域,因此Fresco自行实现了图片资源的回收机制。由于是放在Native堆当中的,因此这部分是用C++来写的,因此阅读难度相对较大,另外Fresco这个库也相对较大,会增加2M左右的体积。在这个流量不值钱的年代,增加的这点体积好像也算不了什么?

总结,如果你喜欢偷懒,又不擅长处理内存溢出问题,而且你的应用大量使用图片的场景下,推荐使用Fresco。其他场景下,优先选择Glide吧。


为什么使用Realm?



对Android开发者而言,Sqlite再熟悉不过了,但是你会发现Sqlite是面向结构式的语言而并非面向对象式的。而Realm则是一种面向对象的数据库,因此你无须再编写sql语句就可以将对象存储到数据库当中。如果你的项目是一个新项目,而你又是面向对象的坚定主义者,那么使用Realm是你不二的选择。如果你是在改造老项目,而且项目又比较大,请不要使用Realm,否则会成为你的噩梦.

关于Realm更多信息,直接参考官网即可。

项目基础结构



包目录划分


打造急速开发框架FastApp

我们重点来看与网络层相关的api包和与界面相关的base包。

api


网络请求客户端配置及放置相关的请求接口。convert子包中用于防止请求和响应转换器,exception子包中则定义了实现约定的请求错误码等,而remote子包中则放置具体的请求接口。

base


框架的核心包。BaseApplication继承于Application,其内部主要提供数据存储,个性化toast等功能。 
BaseSubscriber和BaseObserver则分别继承RxJava中的Subscriber和Observer。ui子包当中则是相关的有关界面的基本组件:BaseActivity,BaseDetailFragment,BaseFragment,BaseListFragment,BaseTabFragment。因此我们的Activity需要继承BaseActivity,普通的Fragment需要继承BaseFragment,如果是带下载刷新,上拉加载更多的则需要继承BaseListFragment.BaseDetailFragment和BaseFragment类似,但是再带了下载刷新,通常用于支持手动下拉刷新的详情页面。

为了方便理解,这里我们用uml来描述一下: 
打造急速开发框架FastApp

界面演示


打造急速开发框架FastApp

打造急速开发框架FastApp

打造急速开发框架FastApp

简单示例


为了方便演示,这里我们使用了几个公共api,借助该API我们快速搭建一个简单的新闻阅读类App。已经放在Github当中。

https://github.com/closedevice

如何您想进技术群和大牛们交流,关注公众号在后台回复 “加群” 即可

如果您觉得不错,请别忘了分享到您的朋友圈让更多的人看到!! 您的举手之劳,就是对我最好的支持,非常感谢!



打造急速开发框架FastApp

每日掏心话

所有的担当,都是为了明天比今天更好。既然选择了追求,就不要哭泣。坚持一下,扛过今天,幸福就更近一步。真正能把人累垮的,是心里的绝望!


打造急速开发框架FastApp


推荐阅读





小密圈
这里聚集了业界内的大牛,值得各位大牛的加入!


打造急速开发框架FastApp

看完本文有收获?请转发分享给更多人
关注「杨守乐」,提升编程技能

【QQ技术群】279126311 []
【QQ技术群】484572225 [未]

以上就是:打造急速开发框架FastApp 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论