youlookwhat / CloudReader

🗡️ 云阅:一款基于网易云音乐UI,使用玩Android Api,Retrofit2 + RxJava2 + Room + MVVM-databinding架构开发的Android客户端
https://youlookwhat.github.io/CloudReader
Apache License 2.0
4.94k stars 1.33k forks source link

打开云阅读发现又更新了。 #96

Open leahy913 opened 5 years ago

leahy913 commented 5 years ago

感谢大神的开源项目。一年前在简书刷到这个App,因为很喜欢网易云的设计风格,所以就下载源码看了下。结果一入深似海,当时被编码风格吸粉了,然后才开始了解MvvM。 今年入职一个小公司,上线了两个App(虽然没人用)都是结合大神这套框架写得。因为从事Android开发也快两年了,一直是一个人写代码,也没什么人交流,所以云阅对我影响很大,可以说作者算的上我的Android老师了。 这两天没事干也尝试写了些东西,整理了一下。希望大神闲暇的时候帮我看看,代码存在哪些问题 https://github.com/leahy913/WanAndroid 谢谢!

youlookwhat commented 5 years ago

很高兴对你有这么大的帮助,一直以为自己写的东西对大家只是玩玩而已,你可以加我qq或微信大家多交流。这套架构有些好处也有弊端,好处是使用databinding 替代了注解取 id 的形式,类里面少了大量取id的代码,而且改了xml结构对应的代码变动也很小,弊端我觉得是在xml代码里面设值,这样感觉很不适应和不方便排查问题。 mvvm最大的特点是数据和布局联动,项目里的登录页面是很好的例子,以前的架构不规范没有突出这个特点,以前的更像mvp+databinding 就像你写的项目架构一样,我看了一下,也是我之前的模式,不过这种模式也不能说是一个不好用的模式,我反而觉得这样结合了各自的优点。只是mvvm包名要要改为p了,它相当于p层了。 现在我规范的项目相当于传统的mvvm了,数据的变化相当于视图的变化。看得出来你也是一位善于学习和总结的人,以后的路还很长,希望你前程似锦!

leahy913 commented 5 years ago

谢谢大神的回复,也谢谢你能给大家带来这么优秀的开源项目

Cazaea commented 5 years ago

我也是一直在参考这个项目,并从中学到了很多东西,良师益友,受益一生。

因为项目需要,也改动了一些地方:

1.整体更换了Rx2.0; 2抽出了BaseResponse,对后台不规范的JSON进行处理; 3.抽出RxUtils工具类,抽出线程调度及异常捕获; 4.格式化了Retrofit网络日志,便于在控制台查看接口调用情况; 5.根据GET和POST,添加接口固定参数(主要是公司项目还有鉴权参数)

还没有完全学透,就像迫不及待用于项目,每次看到项目有更新,我都十分激动,太感谢你了。

 /**
     * 登录
     *
     * @param account  账号
     * @param password 密码
     */
    @FormUrlEncoded
    @POST("/app/login/check")
    Observable<BaseResponse<User>> login(@Field("account") String account, @Field("password") String password);
    /**
     * 下一步操作
     */
    public MutableLiveData<Boolean> next() {
        final MutableLiveData<Boolean> data = new MutableLiveData<>();
        if (!verifyUserInfo()) {
            data.setValue(false);
            return data;
        }
        HttpClient.Builder.getBaseServer()
                .login(phone.get(), "")
                .compose(RxUtils.schedulersTransformer())
                .compose(RxUtils.exceptionTransformer())
                .subscribe(new BaseSubscriber<User>() {
                    @Override
                    public void onError(ResponseThrowable e) {
                        ToastUtil.showShort(e.getMessage());
                        data.setValue(false);
                    }

                    @Override
                    public void onResult(User pUser) {
                        Injection.get().addData(pUser);
                        UserUtil.handleLoginSuccess();
                        data.setValue(true);
                    }
                });
       //  data.setValue(true);
        return data;
    }
youlookwhat commented 5 years ago

@Cazaea 客气了,这项目运用到公司项目确实有很多需要改进的,这5点都有必要拓展,我也改了其中的一些,不过没有同步到这个项目中。

Cazaea commented 5 years ago

老大,这样的功能怎么实现呢? 在MainActivity获取NFC的状态,是否支持NFC和NFC是否打开,通过这两个值动态判断“开启”按钮的显示隐藏,但是&&逻辑运算符报错。 android:visibility="@={(main.isHasNfc)&&(!main.isOpenNfc)?View.VISIBLE:View.GONE}"

Cazaea commented 5 years ago

可以加您的QQ吗,方便交流一下。

youlookwhat commented 5 years ago

可以的

SoarY commented 5 years ago

自己之前看了MVVM+Databinding架构,自己搭了个小Demo,但是界面着实太丑,前段时间在网上找开源项目和素材看见了作者的云阅,当时真的眼前一亮,就打算看下大神的实现自己撸一套学习,现在把作者的项目自己搭建一个,现在也才搭了一个架子。 总的来说在作者的项目中学到了很多东西,非常感谢作者。 还有看作者的资料是武汉,真的很欣慰。

zhangjianhd commented 4 years ago

老大,这样的功能怎么实现呢? 在MainActivity获取NFC的状态,是否支持NFC和NFC是否打开,通过这两个值动态判断“开启”按钮的显示隐藏,但是&&逻辑运算符报错。 android:visibility="@={(main.isHasNfc)&&(!main.isOpenNfc)?View.VISIBLE:View.GONE}"

要转义,用

&amp;&amp;

android:visibility="@={(main.isHasNfc) &amp;&amp; (!main.isOpenNfc)?View.VISIBLE:View.GONE}"
Cazaea commented 4 years ago

老大,这样的功能怎么实现呢? 在MainActivity获取NFC的状态,是否支持NFC和NFC是否打开,通过这两个值动态判断“开启”按钮的显示隐藏,但是&&逻辑运算符报错。 android:visibility="@={(main.isHasNfc)&&(!main.isOpenNfc)?View.VISIBLE:View.GONE}"

要转义,用

&amp;&amp;

android:visibility="@={(main.isHasNfc) &amp;&amp; (!main.isOpenNfc)?View.VISIBLE:View.GONE}"

非常感谢您!

youlookwhat commented 4 years ago

databinding对这种有复杂条件的处理不太友好,你可以定义一个类,在里面单独处理显示的逻辑,然后引入进来,这样能理解吗

Cazaea commented 4 years ago

databinding对这种有复杂条件的处理不太友好,你可以定义一个类,在里面单独处理显示的逻辑,然后引入进来,这样能理解吗

完全理解,上次提问之后也做了其他的项目,慢慢优化完善了很多地方,现在就不那么写了。

youlookwhat commented 4 years ago

@Cazaea 你已经出道了,哈哈哈

youlookwhat commented 4 years ago

@ZhangJian96 不知是否明白,将(main.isHasNfc)&&(!main.isOpenNfc)?View.VISIBLE:View.GONE这一段放在单独的一个类中处理试试

Cazaea commented 4 years ago

@Cazaea 你已经出道了,哈哈哈

主要还是站在了你们的肩膀上,哈哈

youlookwhat commented 4 years ago

@Cazaea 开源就是为了互相学习嘛