近日,在Google开发者的微博上推荐了一个视频,是2015年开发者峰会上两位Google的Coder的演讲,关于Android应用框架,中文相关介绍文章看这里
演讲中有个demo,类似于一个QQ的聊天界面的程序,用这个例子讲解了如何优雅地处理在各种网络异常的情况下的UI界面,既如何设计一个offline的应用。
网络请求与本地缓存相结合以获取最好的用户体验应当是几乎所有Android应用的基本需求。从我的开发经验看,我们往往会忽略之一点。大部分情况下,都是直接从网络拿回数据显示在界面上,如果网络不好,就不断loading。。。在无网情况下,app是不可用的。

选择哪一种交互是设计阶段必须考虑的,这直接决定了编码方式。当然,一个设计良好的框架必须要提供这些能力:

扯远了,需要一篇文章写一些app中可能用到各种交互与请求逻辑。

下面翻译下Google这个demo的README文件。了解一下设计思想。

简介

这是个简单的社交软件,列表可以展示其他人的消息(我们叫他feed流),用户还可以发送文本信息。

本文的目的是讲述如何设计一个应用,可以离线使用,并在网络可用时同步信息到服务器,尽量不影响用户。

如何工作

关于『离线设计』这个主题,许多解决方案都是依赖于特定的需求,如果想要运用到其他场景,需要一些修改。因此,这个demo的同步逻辑可能并不适合你的需求。你应当把它当做一个例子学习,然后找出适合你的应用的解决方案。不幸的是,没有设计离线应用的万金油。
这里,我们会解释用户的交互流是如何工作的,会给你的应用提供一些不错的想法。
这个例子没有严格依照任何的构架模式,它使用混合方法满足自己的需求。我们假设这个应用会不断成长为一个大的app(因此下面比较复杂)。尽管增加了复杂度,但是我没尽量是这个demo更加真实有用。

组件

数据流

发送消息

当用户点击按钮,首先会发生这么4步:1.验证消息合法性。2.保持消息到本地磁盘存储(这个例子中这是一个job)。3.更新PostModel添加新的信息。4.发送event通知有消息更新。
(可选的)4.a.如果UI可见,在收到event后更新内容。
注意:上面这些步骤没有涉及网络,但是我已经更新了用户界面&&保持必要的数据到磁盘。最后,我们需要与Server同步。

同步的步骤如下
Sync To Server

同步Feed流

同步操作有下面三个组件负责:

保持UI更新

后台与UI的交互需要良好的定义。

UI组件根据自身的生命周期负责注册/反注册EventBus,因为后台永远不会持有UI的引用,我们不想有内存泄漏的风险。

这不是唯一的办法:示例中使用的是一个全局的EventBus,你也可以用Rx实现相似的功能,或者手动设置listener,以及其他相似的技术。总之,你需要根据自己的应用来评估。

安装&&运行&&测试

安装

demo包含一个简单的server,你需要安装Ruby On Rails来运行它。建议你通过Ruby Version Manager来安装。安装完之后,使用下面命令启动server:

> cd server;
> bundle install;
> rake db:migrate RAILS_ENV=development;

这会安装依赖,创建数据库。

运行

服务器

> cd server;
> rails s

客户端

demo中app使用模拟器环境默认的host地址。(http://10.0.2.2:3000)。如果你在模拟器里运行,已经可以正常工作。你可以在设置菜单中修改,或者在DemoConfig类中直接修改。

测试

其他

避免重复发送消息

编写移动应用意味着你要处理不可靠的网络。通过使用持久化的job(存储在本地),在网络可用时,app工作了很不错,可是并不完美。在不可靠的网络条件下,我们的应用可能出现这种情况:服务端那数据已经更新存储了,但是客户端没有收到成功的返回。那么客户端依然认为消息没有上传,会不断重试。如果server的返回有问题,这就会变得更糟糕。
通常情况下,重试就以为这重复上传消息。有很多策略可以解决这个问题。demo中我们使用一个唯一的二维元组(userId, clientId)来避免重复,它的原理如下:

你可以在server/app/controllers/posts_controller.rb中使用error_before_saving_posterror_after_saving_post来触发这种特殊的情况。

版权许可

Copyright (C) 2015 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and limitations under the License.