学习微影项目-day1总结

来源:互联网 发布:北京楼盘数据 编辑:程序博客网 时间:2024/06/05 06:31

之前学习了几款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,吃晚饭去咯

这是相隔 一天的总结:
这个项目做到第二天,发现可能是由于自己水平有限,理解不了作者的思路,很多代码,很多基类的抽取,很多新的工具类都不太能接受,整体来说,这各项目的编码风格和我之前遇到的所有都不同,个人感觉有些杂乱,最主要的是引用的第三方太多了,感觉学不到东西,意识在晚饭前决定放弃这个项目的学习,在这两天的学习中还是收获很多。今晚在做些整理。

0 0
原创粉丝点击