../img/avatar.png

This Tinggeng

androidarchitecture

概述 本文记录 Android 官方关于项目架构的文章. Android Architecture Blueprints [beta] 当我们开始明确如何组织和架构一个AndroidApp的时候,Android Framework层提供了很强大的可伸缩性。 这份自由虽然很有价值,但是同时也导致一个APP内存在如过重的类,命名体系不一样,架构导致难以测试,维护和扩展苦难等问题。 Android架构蓝图打算演示解决这类通用问题可能的方法。 在这个项目中,我们会提供一个机遇不同架构概念和不同工具的同一个项目实现。 你可以使用这些例子作为你创建自己的APP的一个参考,或者直接作为一个基础。本篇集中于代码结构,架构,测试和维护性。 然而,铭记于心的是,利用这些架构和工具,创建一个APP有很多方式,取决于你的侧重点。所以,这些架构不应该被当做是经典案例。 本篇例子中UI刻意保持了简单。 beat版的意义 我们一直在做一些可能会影响我们所有例子的决定。所以我们会在发布正式版之前,一直保持初始化的版本号。 例子 所有的例子都发布在他们对应的分支上。查看对应项目上看的README 以获取详细信息。 -todo-mvp/- 基本的MVP架构 -todo-mvp-loaders/- 基于todo-mvp,使用loaders来获取数据 -todo-mvp-databinding/-基于odo-mvp,使用databinding库 ### 还在进行中的 todo-mvp-contentproviders - 基于todo-mvp-loaders, 使用Content Providers todo-mvp-clean - 基于todo-mvp, 使用Clean Architecture的概念 todo-mvp-dagger - 基于todo-mvp, 使用Dagger2来进行依赖注入 此外,还有很多计划中的例子。 为何是一个待做的项目 这个APP的目的是能够简单快速的理解,而不是增加演示这个复杂的设计和测试方案的复杂性。 可以查看这个APP的规格。 此外,还有一个类似的JavaScript的项目框架,叫TodoMVC。 我应该为我的APP选择哪个例子 每个例子,都有一个选择的尺度,和比较客观的评估,你可以根据你的实际情况选择。 你可能要考虑到你APP的大小,你整个团队的经验,你预估的维护成本,考虑你是否需要为平板,多平台适配,以及自己的框架偏好。 TODO-MVP 总概 这个例子是其他变种版本的基础。这个例子展示MVP模式的一个简单的实现,没有参杂其他的架构框架。 这个例子,使用手动注入依赖的方式来提供本地和远端的数据。异步的任务是通过callback实现的。 注意:在MVP的上下文中,属于view是被重新重载了。 android.view.View被称作"Android View",在MVP中接受presenter发送命令的view被简单的称为"view". Fragments 使用fragment有两个理由: activity和fragment进行隔离,非常适合用来实现MVP。 activity作为一个控制器,用来创建和控制view和presenter。 可以充分利用fragment框架进行平板和多屏幕适配。 关键概念 在这个APP中有四个特点: 任务 任务详细 添加编辑任务 数据统计 每个特点有: 约定view和presenter的定义 activity负责产生fragment和presenter fragment实现view中的接口 presenter实现presenter定义的接口 总之,业务逻辑在presenter中,并且依赖于实现UI工作的view。 view层几乎是不包含业务逻辑的,只负责将presenter中的UI指令转换成UI表现,并且监听用户的UI操作,然后传递给presenter层。 通过接口来约定view和presenter之间的连接。

RxJava源码解析(一)

概述 本文目的是从源码的角度讲解 Rxjava 的重要概念 Observable. RxJava要点解析 对于 Rxjava 还是有很多不理解的地方,加上又有点好奇心,就看看源码,记录在此,水平有限,肯定存在错误的地方,望路过的同行不吝赐教。 lift变换操作的原理 看下lift源码,直接拷贝的源码,未做删减。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public final <R> Observable<R> lift(final Operator<? extends R, ? super T> operator) { return new Observable<R>(new OnSubscribe<R>() { @Override public void call(Subscriber<? super R> o) { try { Subscriber<? super T> st = hook.

RxAndroid入门分享(二)

概述 本文记录 RxJava 中在 Android 中的应用,介绍 RxAndroid 的使用. More RxJava 及其在Android上的应用 开发环境 在 module 的 gradle 中添加 RxAndroid 的相关依赖,如果想体验 rx 在 Android 上的更方便的功能。可以添加 Jake 大神的兼容包 RxBinding。 1 2 3 4 5 6 7 8 9 //RXAndroid compile 'io.reactivex:rxandroid:1.1.0' //RxBinding compile 'com.jakewharton.rxbinding:rxbinding:0.3.0' compile 'com.jakewharton.rxbinding:rxbinding-support-v4:0.3.0' compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:0.3.0' compile 'com.jakewharton.rxbinding:rxbinding-design:0.3.0' compile 'com.jakewharton.rxbinding:rxbinding-recyclerview-v7:0.3.0' //compile 'com.jakewharton.rxbinding:rxbinding-leanback-v17:0.3.0' 以下开始用一个demo来演示 目的地有三个 tab,每个 tab 内的详情用 RecyclerView 展示,下拉刷新用 SwipeRefreshLayout。 布局界面如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?

LayoutInflater中inflate的使用方法

概述 本文记录 LayoutInflater 的 inflate 方法的三个参数的含义. 常常需要使用 LayoutInflater 中 inflate 方法。这个方法有两个重载的版本,一个是含有三个参数的,一个是两个参数的。 1 2 3 4 //resource 代表了要被加载的布局文件的 ID,root 是待附加的父布局 public View inflate (int resource, ViewGroup root) //前两个是一样的,最后一个 attachToRoot 代表是否加载到父布局的树形结构中 public View inflate (int resource, ViewGroup root, boolean attachToRoot) 我们使用最频繁的地方应该就是在 adapter 的 getView 方法中,将 root 值设为 null,或者设一个 parent,将 attachToRoot 设为 false。一般没有特殊的需求的话,这样就可以了。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 @Override public View getView(int position, View convertView, ViewGroup parent) { View root; ViewHolder viewHolder; if (convertView == null) { viewHolder = new ViewHolder(); //加载布局 root = LayoutInflater.

DataBinding 入门简介

概述 本文介绍 DataBinding 的基本概念和接入流程 DataBinding出现的背景 作为一种 MVVM 的实现方式出现. 概念 将数据的 provider 和 consumer 进行绑定,而后进行二者之间同步的一种技术。实现逻辑层和表现层的绑定。 注意事项: 使用的编译工具必须是 gradle,并且使用的 Android gradle 插件版本依旧官方所说,不能低于 Android Plugin for Gradle 1.3.0-beta4; 在使用的 module 的 gradle 文件中添加 apply plugin: ‘com.android.databinding’; 以上部分是 beta 1.3 版本的环境搭建以下是 1.5 的 使用gradle for android 1.5 在 APP module 的 gradle 中添加代码段 1 2 3 dataBinding { enabled = true } 如何使用 工作的流程原理 在编译的时候,dataBinding 回去布局文件中进行文件的解析,然后获取关于 dataBinding 的设置,然后为对应的 view 设置 tag, 然后删除关于 dataBinding 的所有内容。 对于属性中引用 java 变量的值的地方,原理都是调用的对应的 java 的 set 方法进行设置,比如 TextView 的属性 text 对应了 setText();对于 ImageView 的 src 属性 通过一些注解,让其对应 setImageResource 1 2 3 4 @BindingMethod( type = android.

RxAndroid入门分享(一)

概述 本文记录 RxJava 的概念. RxJava 以及响应式函数思想篇 Why 技术产生的背景 在编程中,经常需要切换线程,为了能对结果进行相应处理,经常需要进行回调,随着业务需求的增加,嵌套的回调也会随之增加,不仅增加了代码量,也增加了逻辑的复杂性,增加了理解和维护的难度。 所以就需要一种 既能方便切换线程 又能即是相应变化 又可以简化代码的逻辑,方便维护, 还不需要回调。 What ReactiveX是什么 Reactive Extensions,简称 RX,原来只是微软开发的一个 LINQ 的一个扩展。 微软给的定义是,Rx 是一个函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序,使用 Rx,开发者可以用Observables 表示异步数据流,用 LINQ 操作符查询异步数据流,用 Schedulers 参数化异步数据流的并发处理,Rx 可以这样定义:Rx = Observables + LINQ + Schedulers。 ReactiveX.io 给的定义是,Rx 是一个使用可观察数据流进行异步编程的编程接口,ReactiveX 结合了观察者模式、迭代器模式和函数式编程的精华。 看完微软给的定义已经很详细了,开源组织给的更加精简,里面提到了数据流还有事件,我们来自己看看怎么理解。 这里得提到响应式编程的概念,其中有两个关键点, 事件,事件可以被观察,等待,过滤,响应,也可以触发其他的事件,事件通过数据流的形式对外呈现。 数据流,数据流就像一条河:它可以被观测,被过滤,被操作,或者与另外一条流合并为一条新的流来给新的消费者消费。 所以,响应式编程就是一种基于异步数据流概念的编程模式。其实 EventBus 还有其他的点击事件一样,本质上就是异步的数据流,我们可以为任何的事件创建数据流。比如我们可以为登录操作创建数据流,然后监听这个数据流,进行登录验证这样的响应操作。 主要特点有: 易于并发从而更好的利用服务器的能力。 易于有条件的异步执行。 一种更好的方式来避免回调地狱。 一种响应式方法。 RxJava与传统的Java的不同 在 Rx 中,开发者用 Observables 模拟可被观察的异步数据流,从纯 Java 的观点看,RxJava 的 Observable 类源自于经典的 Gang Of Four 的观察者模式。 与传统观察者的不同 它添加了三个缺少的功能: 生产者在没有更多数据可用时能够发出信号通知:onCompleted()事件。 生产者在发生错误时能够发出信号通知:onError()事件。 RxJava Observables 能够组合而不是嵌套,从而避免开发者陷入回调地狱。 与传统的Iterable的不同 Observables 和 IterablesAPI 是很相似的:我们在 Iterable 可以执行的许多操作也都同样可以在 Observables 上执行。当然,由于 Observables 流的本质,没有如Iterable.