写了一个Gank客户端

银子

摸鱼用gank.io公开API写了个练手项目。主要是在实际的项目中使用一些主流的技术,诸如MVP,RxJava,Dagger等。
项目地址:GankU:https://github.com/rabbitknight/GankU

TL;DR

技术 概要
RxJava2+Retrofit RxJava仅配合Retrofit,作为网络请求资源的处理使用。
MVP 使用mvp架构思想,M层未做较优处理。V、P层隔离、仅接口访问。Activity与Fragment既是V层,又是P与V结合的地方。
Dagger2 强化Dagger的使用,P层、控件、网络请求均使用Dagger注入到Act\Frag。
M D 使用ToolBar、NavView、SRL、CoordinatorLayout等。
Animator 部分使用了属性动画、包含animated-vector向量动画的使用。
Custom View 为ImageView添加包装类实现手势操作,一个使用了贝塞尔曲线的indicator,自定义的ItemDecoration等。
Web 使用腾讯X5内核作为WebView,待添加CustomTabs获取更优秀的效果。
... ...
--- ---

项目结构

└─ganku
    ├─common            + common包,静态变量等
    ├─di                + dagger依赖注入包
    │  ├─component      - 注射器 
    │  ├─module         - 模块
    │  └─scope              - 作用域
    ├─mvp               + mvp包,项目为mvp架构
    │  ├─model          + 数据层,有缺陷
    │  │  └─remote          - bean类等
    │  ├─presenter      + 表现层,专注业务逻辑处理
    │  │  ├─base            - 最基本接口
    │  │  ├─impl            - 接口实现
    │  │  └─interfaces      - 集成接口
    │  └─view           + 显示层,专注View的显示
    │      ├─base           - 最基本的接口
    │      ├─interfaces     - 集成接口
    │      └─ui             + ui显示包,接口实现
    │          ├─activity       - Activity
    │          ├─adapter        - 适配器
    │          ├─fragment       - 碎片,用于显示
    │          ├─listener       - 监听器
    │          └─widget         - 自定义组件
    ├─net               + 网络访问包,注:已被废弃
    │  └─api                - Retorfit的接口
    └─utils             + utils辅助类,String处理等

运行Demo

desc img
desc img
--- ---
launcher launcher
main main1
main2 main2
Web web
--- ---

使用技术:

参考build.gradle

    compile 'com.android.support:appcompat-v7:26.1.0'
    compile 'com.android.support:support-v4:26.1.0'
    compile 'com.android.support:design:26.1.0'
    compile 'com.android.support:recyclerview-v7:26.1.0'
    compile 'com.android.support:cardview-v7:26.1.0'
    compile 'com.android.support:customtabs:26.1.0'
    testCompile 'junit:junit:4.12'
    compile 'com.google.dagger:dagger:2.13'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.13'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.1.6'
    compile 'com.github.bumptech.glide:glide:4.3.1'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1'
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    compile 'com.squareup.okhttp3:okhttp:3.9.0'
    compile 'com.jakewharton:butterknife:8.4.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'

一点点总结

  1. 关于Dagger2的依赖注入,看到一些github上的同级别项目,并没有将Dagger这一流痞的库很好的使用他们在Activity中仍然很多new Clazz();。为此,我强化了Dagger的使用,致使项目中MVP中的P层使用依赖注入到Activity\Fragment,同时很多的View要么使用ButterKnife,要么使用Dagger注入到相应位置,使得在项目中基本看不到new Clazz(); 这种方法。
  2. 关于MVP项目,借助于Dagger2的使用,使得MVP三层分离的比较彻底。三层各司其职,仅通过接口访问,OOP。
    • View层专注于界面的显示,其向外暴露的接口仅用于控制界面的显示效果。
    • Presenter层专注于事务,它通过View层接口传递的信息,进行逻辑处理,并调用V层暴露的接口控制View层界面做出改变。
    • Model层专注于数据,道理上说,V层的事件交于P层处理,P层可能会调用M层的接口获取一些数据。然而因为强化Dagger的使用,我将RRO的网络访问框架直接注入到了P层--,那么M层就一下子消失了--,所以实际上框架可能实际只是MV<strike>p</strike>,还不是MVP。但是使用思想并不意味着要完全实现。
    • Activity\Fragment既是View又是P层与V层结合的地方。Act与Frag对于Android来说既是一个View显示的地方又是一个做逻辑处理。
    • 在MVC思想中,V实际代表的是XML布局,那么C在Android中就是Activity等,对应的很好。但是对于MVP,我们将P层抽离,但是P层又仅能在Activity中被调用,依赖Act存在。而Act又是某种意义上的View,这时的Activity的地位就稍微有点尴尬了。因此实际上,私以为Android中的MVP思想实际是一种代理模式这种说法对于大部分和用户交互的App应该是没问题的。
  3. Rx系函数式编程。函数式编程、响应式编程我了解比较浅,对于这种编程思想来说,一个函数的输出作为另一种函数的输入。函数相互调用形成一种链状的“流”。这与观察者模式不谋而合,通过对这种思想的使用,使得整个工程结构更加清晰,我们只需关注每个函数流的流向即每个函数的功能,将每个逻辑单独抽离,而不关注具体的实现,这使得项目更加清晰,也符合OOP的原则、高内聚低耦合。
  4. 关于自定义View,至今,据我了解,Android从业者呈现一种金字塔形势分布,较为低级的人员充斥在这个市场当中,但越往上的能力者越少。我也在想从13年移动行业的井喷式增长开始,到18年我该毕业的今天,拥有5年左右的开发者,他们在整个行业中处于什么样的地位,他们拥有怎样的技能树。我遇到的人,还是较少,暂不能得到答案。但以不变应万变,基础的东西的变化仍然是较低的,对于自定义View的掌握肯定是必要的。如今开发,想要获得一个效果,搜一下第三方库就很多。虽不要重复早轮子,但是前提是会造轮子。不需要知道细枝末节,但是对于脉络原理还是要知道的。为此学习一些自定义View是很必要的。我在这个项目中实现了一个贝塞尔拟合圆的ViewPager指示器,实际挺简单,300行左右的代码但是对于自定义View的收获还是挺多的。
  5. MD,Material Design是一种设计风格,与IOS的扁平化相对应。目前大部分的App,还是喜欢和IOS对齐,这也没错。我所了解的App中Android端的BiliBili、网易云等对于MD的应用最为出色。可能我们不是写UI的不需要设计的很好看,但是去发现美(无论是何种美)确实应该去做的。
  6. 。。。

TODO

  • IMG
    • ImageViewWrap,手势包装类的优化
    • 妹子图的下载收藏等
  • Web
    • CustomTab的集成,获取更好体验
    • 右上角分享、复制URL等功能
  • 主页
    • 主题切换
    • 部分细节优化
  • ...

Thanks

  1. 首先感谢gank.io 家的API。
  2. 然后某些界面的设计理念参考(读书人的事情不能用抄)了一些例子。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342