/EyesOpener

模仿开眼的视频APP,基于MVP+rxjava2+Retrofit+Dagger2+Glide+Realm+GSYVideoPlayer

Primary LanguageJava

EyesOpener

EyesOpener,一款开眼高仿APP, 基于 MVP+rxjava2+Retrofit+Dagger2+Glide+Realm+GSYVideoPlayer
出于学习的目的使用开眼API做的这款开源视频播放APP,基本涵盖了当前Android主流开源框架,是一个非常适合小白学习的项目。废话不多说,先上截图:
                       

tips

  • 项目还是测试阶段,如果大家有发现BUG或者什么好的建议,可直接提issue
  • 遇到please select SDK的情况,是因为项目需要API27支持,请下载最新SDK
  • 项目仅供学习使用,API数据属于原公司所有,请不要用于其他用途

Point

  • 使用MVP对整个应用进行架构,分为modelUIpresenter三个部分。使用contractViewpresenter联系起来
  • 使用Dagger2将M层注入到P层,将P层注入到V层。可直接调用,无需new
  • 使用ButterKnifeview进行注入
  • 使用retrofitrxjava2进行网络请求
  • 使用okhttp3对网络返回数据进行缓存,配置相关日志,头部消息,超时连接
  • 使用DataManager对所有model层进行汇总整理,统一管理。
  • 使用rxjava2其他操作符进行延时,轮转操作
  • 使用RxPresenter管理所有订阅的生命周期
  • 使用realm进行数据库增、删、改、查
  • 使用GsonFormat进行JSON解析
  • 使用recyclerview完成大部分界面,实现与viewpager结合,下拉刷新,上划加载更多
  • 使用viewpager与多个fragment结合完成主界面,自定义TabLayout.Tab实现开眼同等效果
  • 使用GSYVideoPlayer框架完成视频播放部分
  • 自定义JumpShowTextView实现字体跳转加载
  • 使用glide完成图片加载,圆形头像加载,圆角矩形加载
  • 使用FlowLayout实现搜索热门词流式布局
  • 使用BlockCanary,LeakCanary监测是否存在内存泄漏和过度绘制

Version

V 1.0.0

上传第一版

下一步计划

  • 自定义播放界面,实现开眼播放界面效果
  • 在界面布局上面做新的尝试
  • JumpShowTextView集成为框架,完善JumpShowTextView
  • 将toast等公用操作进行集合整理

遇到的问题

  • 使用diffutil来做数据更新会出现新数据不会显示出来的问题

问题出现的原因是,fragment是直接将数据传递给adapter的,adapter中的data的引用,跟fragmentdata引用一样。当更新fragment中的data,并将其与adapter中对比时,adapterdata已经产生变化,两者相同,所以diffutil无法起作用。解决办法是,不要使用相同引用。

  • recyclerview中添加item时,会出现宽高失效的问题

因为是添加的自定义view,自定义framelayout中已经设置了宽高,然后让TextView显示在center。结果是TextView永远显示在开头。排除了布局问题之后,先查找资料。发现RecyclerView Item布局宽高无效问题探究这篇文章。感觉问题原因应该跟这个差不多。这篇文章讲的是inflate方法使用错误导致的问题。但是我这里是使用自定义view加载的布局,问题同样是在于,RecyclerView在加载子View的时候,使用了默认布局的缘故。解决办法是,在加载子View的时候,先给它设置LayoutParamsMATCH_PARENT

  • Topviewpager切换时,由于调用了JumpShowTextView,会概率性出现image无法加载,fragmenttextview也无法正常加载的问题

问题出现的原因是,我为顶部的Topviewpager设置了每隔六秒自动换页。而换页会调用JumpShowTextView。当整个fragment切换时,Topviewpager并不会停止换页,则会继续调用JumpShowTextView。从而阻塞了主界面的UI绘制,导致剩下的UI无法完成正常绘制。解决办法是,当fragment完成左右切换时,并不会调用onPause,onStart方法。我们需要找到一个当fragment不在界面显示时会调用的方法,并在其中关掉Topviewpager轮播功能。最终我们找到,当fragment不在界面显示时,会调用setUserVisibleHint方法,根据方法中isVisibleToUser参数,选择让Topviewpager关闭或继续轮播。

  • JumpShowTextView在继续显示时,滑动recyclerView使其不显示。同样会出现image无法加载的问题。

问题出现的原因与上一条一致,解决办法是,在recyclerViewsetOnScrollListener方法中进行判断,当Topviewpager不显示时,暂停其轮播。

  • JumpShowTextView中遇到的问题

我是采用rxjavainterval操作符来进行逐字显示的,所以会出现很多问题。比如当逐字显示到一半时,当前View不在主界面显示了。比如当逐字显示到一半时,调用了新的setText。这个时候会导致一系列问题。我选择,在setText中加入withAnimationisRun两个参数进行判断。第一个参数用来判断是否调用逐字显示动画,第二个参数用来判断是否正在进行逐字显示。通过这两个参数可以有效的避免前面所说的问题,从而完成功能。但是可能还会存在些低概率事件没有测试到,这个会在接下来将JumpShowTextView制作成开源框架的过程中解决。

Thanks

API

没有选择自己抓API,选择直接使用了 开眼API

RES

反编译了开眼APP,获取了其中的RES资源

LIB:

主流框架
网络
UI
Other

License

Copyright (c) 2018 EyesOpener

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.