学习微影项目-day1总结

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_Boss_Hao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值