之前学习了几款MVP项目,几个项目的MVP架构都不同,果然每个人的代码风格都不一样。前边大部分学习的是新闻阅读类App,接下来准备学习这款视频播放类的APP。
微影,在线观看视频App,基于Material Design + MVP + RxJava + Retrofit + Realm + Glide
不过这款App真的是用到的开源很多,多的有点杂乱,我在学习的时候还是将一些功能类似的第三方改为之前用过的,毕竟自己用的都是目前最流行,最新的,所以小伙伴们,看完我的总结,你们可以去学习我的代码,我的代码比较适合基础薄弱的同学看,大部分抽取的基类相对于其他人的的抽象的,我的代码比较符合常规逻辑,有些修改为自己可以理解的。
附上我的代码地址
掌上影院,基于Material Design + MVP + RxJava + Retrofit + Realm + Glide
这两天花了一点时间先将项目的整体框架搭了出来
下边对搭建框架过程先理一个思路,之后整理出在搭建框架的过程中遇到的一些问题以及解决办法。
首先是当前的包结构
这就不用解释了,功能划分的很清晰
首先从AndroidManifest.xml开始
首先是application节点,新建一个App类继承Application. 在Android中,启动一个应用,首先会初始化Application,所以将需要的全局属性,以及需要初始化的方法实例都可以写在appication中。
在我的Application中,有这几个方法
private Set<Activity> allActivities;
public void registerActivity(Activity act) {
if (allActivities == null) {
allActivities = new HashSet<Activity>();
}
allActivities.add(act);
}
public void unregisterActivity(Activity act) {
if (allActivities != null) {
allActivities.remove(act);
}
}
public void exitApp() {
if (allActivities != null) {
synchronized (allActivities) {
for (Activity act : allActivities) {
if (act != null && !act.isFinishing())
act.finish();
}
}
}
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}
这里我是用set集合来存取Activity,因为set集合类似一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序,同时Set集合不允许包含相同的元素。
这几个方法的作用是用来记录activity,用来退出多个activity
在每个新建的Activity后,都会调用register方法,所以我将这个方法写在基类BaseActivity中,记录打开的Activity.而取消登记Activity方法写在基类的onDestory中,每个Acitivty在onDestory的时候都会执行这个方法。
接下来进入MainActivity,继承BaseActivity.然后将
设置沉浸式的方法写到这里。其实设置沉浸式的方式很多,到目前为止我也学会好多种,这种方法比较少见,一般在兼容低版本的时候用的多
protected void setTranslucentStatus(boolean on) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
if (on) {
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
}
}
接下来MainActivity中就是绑定布局,这个布局使用的是merge标签,同时没有将布局直接写在布局文件中,而是抽去了一个自定义view。这里merge标签的使用主要是为了减少View树的层次来优化Android的布局,具体可以看我的上一篇文章。
这里的activity_main.xml代码如下
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<com.exercise.handmovie.ui.view.MainView
android:id="@+id/main_view"
style="@style/both_match_style" />
</merge>
紧接着在MainView中,就是我们常规的加载布局,设置布局。以及一些点击事件什么的,具体作者为什么这样做,可能是想保证MainActivity的简洁,清新(纯属自己意淫)。我曾考虑过直接把这些布局写到MainActivity
但是确实造成了臃肿,并且抽取基类也不方便。
目前搭建框架还需要注意的几个地方就是几个自定义控件,以及一个ResideLayout布局。
ResideLayout布局类似于DrawLayout,只不过效果更酷炫,是实现右滑将主页面缩小,左侧显示菜单栏的空间。
使用的话很简单,可参照我的源码,但是查看源码1000多行,目前还没有研究。
之后就是一个禁止滑动的ViewPager。按照作者的写法可以实现禁止滑动,但是感觉代码有点多,所以我还是直接使用自己的方法,代码如下
public class UnScrollViewPager extends ViewPager {
public UnScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public UnScrollViewPager(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
return true;//该方法返回为true,表明该方法已处理该事件,该事件不会传播出去
}
}
对了,还有一件让我很神奇的事情,就是左侧的菜单栏,刚开始作者只给TextView设置文字,而没有设置图片,于是我好奇这些图标在哪里设置,原来是在代码中给TetxView设置的,同时使用了第三方的图片库。今天大概就是这么整理了一下,接下来才是这个项目的重点。
ok,吃晚饭去咯
这是相隔 一天的总结:
这个项目做到第二天,发现可能是由于自己水平有限,理解不了作者的思路,很多代码,很多基类的抽取,很多新的工具类都不太能接受,整体来说,这各项目的编码风格和我之前遇到的所有都不同,个人感觉有些杂乱,最主要的是引用的第三方太多了,感觉学不到东西,意识在晚饭前决定放弃这个项目的学习,在这两天的学习中还是收获很多。今晚在做些整理。