热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MVP+Dagger2+Rxjava+Retrofit+GreenDao开发的小应用,包括新闻、图片、视频3个大模块,代码封装良好...

练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的。代码量还是有的,里面做了大量封装

练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的。代码量还是有的,里面做了大量封装,总体代码整理得非常干净,这个我已经尽力整理了。

不管是文件(java、xml、资源文件)命名。还是布局设计尽量简单简洁,代码不会写的非常复杂。整个代码结构有非常高的统一度,结构也比較简单清晰,方便理解。里面做了大量的封装,包含基类的构建和工具类的封装。再配合Dagger2的使用能够极大地减轻V层(Activity和Fragment)的代码,假设你有看源代码的话你会发现大部分V层有效代码不怎么会超出100行(不含import语句)。基本上每一个界面都会特意去使用一些知识。所以里面有些功能不是必要的而纯粹是用了使用某些知识点。

项目地址:https://github.com/Rukey7/MvpApp

Screenshot

  

 

 

 

 

  

项目结构

先说一些项目的大体结构,了解这个看代码就更easy。当然了,每一个人写代码都有自己的一套风格,不一定别人的就适合你。可是我认为这个非常重要,它相当于整个App的根基。假设这部分不看能够直接跳过。

项目文件夹结构:


上面是大体的文件夹结构,更细分的结构请看源代码。这里仅仅说明MVP相关部分。这里把同一个界面的V层实现和P层实现放在了同一个文件。相关接口也放在一起。假设用的不是基础接口的话。Google的样例代码也是放在一起的。这样做的优点是在看代码的时候能够非常方便地查阅,大家都知道Java是面向接口编程。而我在代码中V层持有的是P层的实现接口,详细的P层实现类是通过Dagger注入的,相同P层持有的是V层的实现接口,详细的V层实现类也是通过Dagger注入的。试想一下,假设V层和P层的实现类分开放,当你按F3跳到的是P层的接口,然后再整个项目里找相应的实现类,假设项目结构比較乱的话就更麻烦了。我把通用的接口都提取出来放base文件夹里,这样适当降低些文件的创建,用MVP架构会比寻常多生成非常多文件,特别是和Dagger一起使用。

知识总结

这里列一下一些我认为可能比較有參考价值的知识点。算是对一些知识点的使用总结,假设认为都非常easy那也跳过- -。

  1. V层基类的构建,包含BaseActivityBaseFragment,对外提供了相同的接口,这样不管在写Activity或Fragment时保持代码高度一致,同一时候里面统一注入了P层的实现和一个网络载入和异常的控件,当中BaseFragment做了懒载入的处理,仅仅要继承这个基类就能实现载入。
  2. 欢迎界面SplashActivity本身没什么东西,从别人那里拷了一个Rxjava实现的倒计时。还有就是倒计时那个button是个自己定义控件,这个控件在须要button实现特殊点击效果的时候挺好用,省去写Drawable的麻烦;
  3. 主页面HomeActivity能够看下DrawerLayout配合Fragment切换时的处理;
  4. 新闻首页NewsMainFragment可看下ViewPagerAdapter在做增删和位置调换时的处理。还有RxBus的使用,须要配合栏目管理界面看。
  5. 新闻列表NewsListFragment的多种不同布局的处理。头部加入无限轮播的Banner。列表加入进入动画效果。列表点击波纹效果。载入很多其他、刷新、载入中和网络异常等等;
  6. 新闻详情NewsArticleActivity里配合ScrollView做的头部标题动画效果处理,自己定义的ScrollView可实现当文章滚动究竟部是可继续上拉载入下一篇文章,提示对话框的使用,ViewStub的使用,继承BaseSwipeBackActivity就可实现左滑退出。

    里面对富文本的处理用了RichText这个库。会报内存泄漏须要注意。

  7. 专题SpecialActivity里带头部的列表实现,还有点击索引跳转到列表相应位置,自己定义的标签流布局控件TagLayout。配合CoordinatorLayout的自己定义behavior。
  8. 图片新闻PhotoSetActivity中ViewPager在显示图片时的载入中和载入异常的处理,自己定义的拖拽布局DragSlopLayout。
  9. 栏目管理ChannelActivity里RecyclerView拖拽的处理和两个列表关联的处理,RxBus发送事件。数据库使用;
  10. 图片首页PhotoMainFragment里属性动画Keyframe和PropertyValuesHolder的使用;
  11. 美女图片BeautyListFragment和福利图片列表WelfareListFragmentRecyclerView瀑布流的使用。我之所以写两个相同的界面是由于网易图片接口返回的数据带有分辨率參数,能够直接设置图片缩放比例显示的大小来实现真正的瀑布流,绝对不会像有的App里的瀑布流图片被截断的情况。而干货网接口返回的图片数据没有分辨率这个參数。我通过先计算每一个图片的分辨率再进行显示。速度上会比前一个慢点,详细体验可看App效果;
  12. 大图BigPhotoActivity的图片全屏显示,占用SystemBar和NavigationBar。图片的收藏,Glide进行图片下载,处理PhotoView和ViewPager使用时的异常。
  13. 视频播放VideoPlayerActivity里用IjkPlayer做的视频播放器,视频弹幕的处理。视频下载、收藏和分享;
  14. 图片和视频收藏相关界面里startActivityForResult的使用,列表的点击反馈。列表删除动画;
  15. 视频下载相关界面简易下载库FileDownloader的封装使用,下载控制。进度显示,删除操作处理;
  16. 设置界面关于PreferenceScreen的简单运用。这东西应该用的不多,使用方法倒是挺特别的。
  17. 每一个界面切换尽量展示不同的进入退出动画,使用overridePendingTransition()来实现不同动画效果。事实上5.0有体验更好的交互动画处理接口。只是这里适配到4.0;
  18. Retrofit配合RxJava的使用,使用OkHttp拦截器功能做缓存处理,Dagger2的使用,RxBus的封装,在网上看到认为封装的挺好的拿过来用。列表库的封装;
  19. 简易多任务下载器的封装。注意里面用的下载器没有多线程,也没有使用Service,之前也有做过多线程下载后面改掉了,网上有比較好的开源项目FileDownloader。感兴趣自己看下;

第三方库

列一下用到的第三方库:

  • leakcanary:检測应用内存泄漏问题,这个都知道吧
  • butterknife:帮助Android控件和回调的进行依赖注入。JakeWharton大神的力作
  • dagger2:Android和Java依赖注入库
  • rxjava:一个实现异步操作的库,如今非常火
  • RxAndroid:用于Android的Rxjava绑定库
  • RxBinding:配合Rxjava处理控件异步调用
  • RxLifecycle:防止RxJava中subscription导致内存泄漏
  • RxPermissions:基于RxJava开发的用于帮助在Android 6.0中处理执行时权限检測
  • retrofit:眼下最好用的网络通讯库。应该都用过吧
  • okhttp:okhttp和retrofit做网络通讯是绝配
  • greenDAO:ORM数据库,能配合rxjava使用
  • logger:Log库。让打印的Log变得非常美丽
  • glide:Google出品的图片载入库。这里有非常好的指导文档:https://mrfu.me/2016/02/27/Glide_Getting_Started/
  • BaseRecyclerViewAdapterHelper:非常好用的RecyclerView多功能适配器库。项目里我并没有直接用这个库,而是按我自己使用习惯在它较早的代码上做了些修改
  • recyclerview-animators:RecyclerView的动画库,内置了非常多的动画效果
  • CircleImageView:非经常常使用的用来显示圆形头像的库
  • PhotoView:可依据手势进行缩放的图像库。这个也非经常见
  • AndroidImageSlider:展示头部Banner的库。动画效果非常多,只是须要依赖picasso和nineoldandroids这两个库
  • NumberProgressBar:性感的数字进度条
  • FlycoTabLayout:样式比TabLayout多样的Tab库
  • FlycoDialog:多功能的Dialog
  • FlycoLabelView:加入角标的库
  • gson:帮助Json和Object转换。这个也经常使用
  • fastjson:功能同gson,有些地方gson不能处理能够试试这个,阿里巴巴出品
  • ijkplayer:B站出品的视频解码库
  • DanmakuFlameMaster:相同B站出品的弹幕库
  • ShineButton:炫酷效果的点击button,主要用于显示收藏之类的动画
  • RichText:富文本的处理库。用起来挺方便就是有内存泄漏- -
  • Android-SpinKit:集成多种动画效果的Drawable,之前有看源代码认为代码封装得挺好,动画不仅仅仅仅能用在View上
  • filepicker:这个是用来处理PreferenceScreen的文件选中库。PreferenceScreen感觉平时不怎么看到使用,使用方法到时挺特别
  • tinker:微信Android热补丁方案。功能强大。和其他热修补方案对照看这里wiki
  • DragSlopLayout:一个辅助开发拖拽功能的库。这是我为了做这个App的某些功能封装的库- -,如今也实用在工作的项目上
  • IjkPlayerView:基于ijkplayer开发的播放器,也是为了做这个App的视频播放功能封装的库- -,里面加了弹幕功能,感兴趣能够看下
  • TagLayout:这也是我封装的库,主要是标签布局功能,还能够单独作为特殊点击效果的button

其他

这个项目都是想到什么加什么功能的。本来想加个换肤功能,现成的换肤库也有。只是考虑到要修改的地方也不少。临时没加上去。后面看有没有好的想法再弄。项目持续更新,有新想法会写上去,有问题能够发消息给我。希望能对你有所帮助

错误说明

1、非常多人反映点击视频播放的时候崩掉了。这里统一说明一下。错误大致这样:


这是由于android有分不同的CPU架构,比方armv7a、armv5、X86等等,当你使用so库的时候须要依据机型来选择相应版本号,而我在视频播放那个库里仅仅引用了‘tv.danmaku.ijk.media:ijkplayer-armv7a:0.6.2’ 这个库,应该大部分机型是这样的架构,所以有的机型可能就跑不了,你能够依据你的机型来选择加入其他的,详情能够看B站的说明ijkplayer,比方:


64位的库要求SDK21以上,B站有更新版本号,假设要用的时候记得统一后面的版本号号。

2、另一个视频播放的相关问题。就是假设你要播放其他的视频格式比方:MKV、AVI、RM等等,直接用也是播不了的,这个你须要又一次编译ijkplayer去配置支持这些视频格式。详细编译方法看ijkplayer的指导说明吧,开启多种格式支持的话so就变非常大了。

假设你懒得编译的话我之前自己编译了一个armv7a的相应so库,你能够看这里ijkplayer-armv7a。库太大了其他版本号就没传上去了,有须要在联系我吧。




推荐阅读
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 微信小程序导航跟随的实现方法
    本文介绍了在微信小程序中实现导航跟随的方法。通过设置导航的position属性和绑定滚动事件,可以实现页面向下滚动到导航位置时,导航固定在页面最上方;页面向上滚动到导航位置时,导航恢复到原始位置;点击导航可以平滑跳转到相应位置。代码示例也给出了具体实现方法。 ... [详细]
  • 最近做项目时遇到一个问题,产品搜索后出来相关的列表,点击相关商品进入它的详情,返回后组件被重新创建,但产品需求是需要保留进入 ... [详细]
  • 【clientX,offsetX,screenX】  【scrollWidth,clientWidth,offsetWidth】的区别
    一、深刻认识clientX,offsetX,screenX概念(来源于网络):clientX设置或获取鼠标指针 ... [详细]
author-avatar
那0年_277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有