CloudReader
CloudReader copied to clipboard
打开云阅读发现又更新了。
感谢大神的开源项目。一年前在简书刷到这个App,因为很喜欢网易云的设计风格,所以就下载源码看了下。结果一入深似海,当时被编码风格吸粉了,然后才开始了解MvvM。 今年入职一个小公司,上线了两个App(虽然没人用)都是结合大神这套框架写得。因为从事Android开发也快两年了,一直是一个人写代码,也没什么人交流,所以云阅对我影响很大,可以说作者算的上我的Android老师了。 这两天没事干也尝试写了些东西,整理了一下。希望大神闲暇的时候帮我看看,代码存在哪些问题 https://github.com/leahy913/WanAndroid 谢谢!
很高兴对你有这么大的帮助,一直以为自己写的东西对大家只是玩玩而已,你可以加我qq或微信大家多交流。这套架构有些好处也有弊端,好处是使用databinding 替代了注解取 id 的形式,类里面少了大量取id的代码,而且改了xml结构对应的代码变动也很小,弊端我觉得是在xml代码里面设值,这样感觉很不适应和不方便排查问题。 mvvm最大的特点是数据和布局联动,项目里的登录页面是很好的例子,以前的架构不规范没有突出这个特点,以前的更像mvp+databinding 就像你写的项目架构一样,我看了一下,也是我之前的模式,不过这种模式也不能说是一个不好用的模式,我反而觉得这样结合了各自的优点。只是mvvm包名要要改为p了,它相当于p层了。 现在我规范的项目相当于传统的mvvm了,数据的变化相当于视图的变化。看得出来你也是一位善于学习和总结的人,以后的路还很长,希望你前程似锦!
谢谢大神的回复,也谢谢你能给大家带来这么优秀的开源项目
我也是一直在参考这个项目,并从中学到了很多东西,良师益友,受益一生。
因为项目需要,也改动了一些地方:
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;
}
@Cazaea 客气了,这项目运用到公司项目确实有很多需要改进的,这5点都有必要拓展,我也改了其中的一些,不过没有同步到这个项目中。
老大,这样的功能怎么实现呢?
在MainActivity获取NFC的状态,是否支持NFC和NFC是否打开,通过这两个值动态判断“开启”按钮的显示隐藏,但是&&逻辑运算符报错。
android:visibility="@={(main.isHasNfc)&&(!main.isOpenNfc)?View.VISIBLE:View.GONE}"
可以加您的QQ吗,方便交流一下。
可以的
自己之前看了MVVM+Databinding架构,自己搭了个小Demo,但是界面着实太丑,前段时间在网上找开源项目和素材看见了作者的云阅,当时真的眼前一亮,就打算看下大神的实现自己撸一套学习,现在把作者的项目自己搭建一个,现在也才搭了一个架子。 总的来说在作者的项目中学到了很多东西,非常感谢作者。 还有看作者的资料是武汉,真的很欣慰。
老大,这样的功能怎么实现呢? 在MainActivity获取NFC的状态,是否支持NFC和NFC是否打开,通过这两个值动态判断“开启”按钮的显示隐藏,但是&&逻辑运算符报错。
android:visibility="@={(main.isHasNfc)&&(!main.isOpenNfc)?View.VISIBLE:View.GONE}"
要转义,用
&&
即
android:visibility="@={(main.isHasNfc) && (!main.isOpenNfc)?View.VISIBLE:View.GONE}"
老大,这样的功能怎么实现呢? 在MainActivity获取NFC的状态,是否支持NFC和NFC是否打开,通过这两个值动态判断“开启”按钮的显示隐藏,但是&&逻辑运算符报错。
android:visibility="@={(main.isHasNfc)&&(!main.isOpenNfc)?View.VISIBLE:View.GONE}"
要转义,用
&&
即
android:visibility="@={(main.isHasNfc) && (!main.isOpenNfc)?View.VISIBLE:View.GONE}"
非常感谢您!
databinding对这种有复杂条件的处理不太友好,你可以定义一个类,在里面单独处理显示的逻辑,然后引入进来,这样能理解吗
databinding对这种有复杂条件的处理不太友好,你可以定义一个类,在里面单独处理显示的逻辑,然后引入进来,这样能理解吗
完全理解,上次提问之后也做了其他的项目,慢慢优化完善了很多地方,现在就不那么写了。
@Cazaea 你已经出道了,哈哈哈
@ZhangJian96 不知是否明白,将(main.isHasNfc)&&(!main.isOpenNfc)?View.VISIBLE:View.GONE
这一段放在单独的一个类中处理试试
@Cazaea 你已经出道了,哈哈哈
主要还是站在了你们的肩膀上,哈哈
@Cazaea 开源就是为了互相学习嘛