创造优秀的 Android 应用离线体验

阅读 3349
收藏 285
2016-12-15
原文链接:zhuanlan.zhihu.com

最近几年,Google、Microsoft、Facebook 等公司都不约而同的盯上了非洲大陆。为了能更好服务像这样网络条件很差的用户,作者在这里分享了你可以怎样组织自己 Android 应用的离线架构。

为什么我得考虑这些?

出色的应用必然有着出色的用户体验。用户不会在乎网络的好坏,只会看到你的应用卡住,然后卸载掉你的应用。因此真正的挑战是为这些网络状况不佳的用户设计具有优秀用户体验的应用。

应该怎么做?

1.确定连接

作者推荐使用 Facebook’s Network Connection class 来监听当前应用的网络状况。如果你用到了 OkHttp,可以结合下面的代码来使用:

public class SamplingInterceptor implements Interceptor
{
    @Override
    public Response intercept(Chain chain) throws IOException
    {
        Request request = chain.request();
        DeviceBandwidthSampler.getInstance().startSampling();
        Response response = chain.proceed(request);
        DeviceBandwidthSampler.getInstance().stopSampling();
        return response;
    }
}

2.高效缓存

高效缓存和重用之前获取的资源的能力是优化性能的关键,关于 HTTP 缓存策略可以看看这里

3.本地操作,全局同步(Act locally, sync globally)

使模型持久化,当服务器有新的数据时,首先更新 Presenter 层,同时通知视图进行更新。这里推荐通过 EventBus 来实现。同样,当你需要将数据发送给服务器时,先更新数据到 Presenter 层并更新界面,再上传至服务器。不要显示进度条,并等待服务器相应后再更新界面。如果设备处于离线状态,那么就在恢复在线状态后重试。可以尝试用 Evernote 的 AndroidJob 来简化任务调度。

如果你还不了解什么是 Presenter,先看看 Google 的 Android 应用架构蓝图吧。: )

4.高效的线程

数据交互会需要额外的线程,但你要避免创建太多的线程。对于网络任务和本地任务,应当各自有一个单独的队列,你不会希望挂起的网络任务成为本地任务的瓶颈。这里推荐使用 RxJava来帮助处理线程调度


5.图像优化

根据网络状况控制要获取的图像质量,推荐默认使用 RGB_565 的图片压缩参数,如果网络情况允许再去请求更高质量的图像。

6.使用 Big Cookie model

对于 Android 设备,完全工作的无线网络功能有着较大的功耗,因此在 Android 中有着不同的网络连接状态以节省能耗,但当 Android 在创建一个新的网络连接时,网络模块会转换到全功率状态。因此,考虑到这点,你应当尽可能的选择一个合适的时间点一次性提交你的数据,以确保消耗尽可能小的功耗。也就是在每次传输会话期间传输尽可能多的数据(big cookie),以避免创建小而频繁的网络连接。

对此如果想了解更多,可以看看 Google 官方的 Efficient Data Transfers 系列视频。

原文:Offline App Architecture, build for the Next Billion

评论