Android App 开发新尝试:模拟服务器数据接口 - MockApi

本文介绍了如何在Android App开发中实现MockApi,以在不依赖服务器的情况下进行快速测试。通过分层设计、模拟接口的开关和不同请求结果的模拟,作者展示了如何在客户端代码中添加模拟数据接口功能,以减少开发中的困扰。文章详细讲解了MockApi的设计过程、关键代码和实现策略,提供了示例源码,旨在帮助开发者提升开发效率。
摘要由CSDN通过智能技术生成

现在搞开发,很多人都是搞的体力活儿,恰恰丢失了真正的“开发精神”。什么是“开发精神”?是探索,是向前求知。今天想和大家分享的是前辈的 Android App 开发新尝试。
原文地址:https://www.cnblogs.com/everhad/p/6219795.html
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块。本篇文章就尝试为使用gradle的android项目设计实现MockApi。

需求概述

在app开发过程中,在和服务器人员协作时,一般会第一时间确定数据接口的请求参数和返回数据格式,然后服务器人员会尽快提供给客户端可调试的假数据接口。不过有时候就算是假数据接口也来不及提供,或者是接口数据格式来回变动——很可能是客户端展示的原因,这个是产品设计决定的,总之带来的问题就算服务器端的开发进度会影响客户端。

所以,如果可以在客户端的正常项目代码中,自然地(不影响最终apk)添加一种模拟服务器数据返回的功能,这样就可以很方便的在不依赖服务器的情况下展开客户端的开发。而且考虑一种情况,为了测试不同网络速度,网络异常以及服务器错误等各种“可能的真实数据请求的场景”对客户端UI交互的影响,我们往往需要做很多手动测试——千篇一律!如果本地有一种控制这种服务器响应行为的能力那真是太好了。

本文将介绍一种为客户端项目增加模拟数据接口功能的方式,希望能减少一些开发中的烦恼。

设计过程

下面从分层设计、可开关模拟模块、不同网络请求结果的制造这几个方面来阐述下模拟接口模块的设计。

为了表达方便,这里要实现的功能表示为“数据接口模拟模块”,对应英文为MockDataApi,或简写为MockApi,正常的数据接口模块定义为DataApi。

分层思想

说到分层设计,MVC、MVP等模式一定程度上就起到了对代码所属功能的一个划分。分层设计简单的目标就是让项目代码更加清晰,各层相互独立,好处不多说。

移动app的逻辑主要就是交互逻辑,然后需要和服务器沟通数据。所以最简单的情形下可以将一个功能(比如一个列表界面)的实现分UI层和数据访问层。

下面将数据访问层表述为DataApi模块,DataApi层会定义一系列的接口来描述不同类别的数据访问请求。UI层使用这些接口来获取数据,而具体的数据访问实现类就可以在不修改UI层代码的情况下进行替换。

例如,有一个ITaskApi定义了方法List getTasks(),UI层一个界面展示任务列表,那么它使用ITaskApi来获取数据,而具体ITaskApi的实现类可以由DataApi层的一个工厂类DataApiManager来统一提供。

有了上面的分层设计,就可以为UI层动态提供真实数据接口或模拟数据接口。

模拟接口的开关

可能大家都经历过在UI层代码里临时写一些假数据得情况。比如任务列表界面,开发初,可以写一个mockTaskData()方法来返回一个List。但这种代码只能是开发阶段有,最终apk不应该存在。

不能让“模拟数据”的代码到处散乱,在分层设计的方式下,可以将真实的数据接口DataApi和模拟数据接口MockDataApi分别作为两个数据接口的实现模块,这样就可以根据项目的构建类型来动态提供不同的数据接口实现。

实现MockDataApi的动态提供的方法也不止一种。

一般的java项目可以使用“工厂模式+反射”来动态提供不同的接口实现类,再专业点就是依赖注入——DI框架的使用了。
目前gradle是java的最先进的构建工具,它支持根据buildType来分别指定不同的代码资源,或不同的依赖。
可以在一个单独的类库module(就是maven中的项目)中来编写各种MockDataApi的实现类,然后主app module在debug构建时添加对它的依赖,此时数据接口的提供者DataApiManager可以向UI层返回这些mock类型的实例。

为了让“正常逻辑代码”和mock相关代码的关联尽量少,可以提供一个MockApiManager来唯一获取各个MockDataApi的实例。然后在debug构建下的MockApiManager会返回提供了mock实现的数据接口实例,而release构建时MockApiManager会一律返null。

不同请求结果的模拟

MockApi在多次请求时提供不同的网络请求结果,如服务器错误,网络错误,成功等,并模拟出一定的网络延迟,这样就很好的满足了UI层代码的各种测试需求。

为了达到上述目标,定义一个接口IMockApiStrategy来表示对数据请求的响应策略,它定义了方法onResponse(int callCount)。根据当前请求的次数callCount,onResponse()会得到不同的模拟响应结果。很明显,可以根据测试需要提供不同的请求响应策略,比如不断返回成功请求,或者不断返回错误请求,或轮流返回成功和错误等。

关键代码解析

下面就给出各个部分的关键代码,来说明以上所描述的MockDataApi模块的实现。

UI层代码

作为示例,界面MainActivity是一个“任务列表”的展示。任务由Task类表示:

public class Task {
  public String name;
}

界面MainActivity使用一个TextView来显示“加载中、任务列表、网络错误”等效果,并提供一个Button来点击刷新数据。代码如下:

public class MainActivity extends Activity {
    private TextView tv_data;
    private boolean requesting = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_data = (TextView) findViewById(R.id.tv_data);

        getData();
    }

    private void getData() {
        if (requesting) return;
        requesting = true;

        ITaskApi api = DataApiManager.ofTask();
        if (api != null) {
            api.getTasks(new DataApiCallback<List<Task>>() {
                @Override
                public void onSuccess(List<Task> data) {
                    // 显示数据
                    StringBuilder sb = new StringBuilder("请求数据成功:\n");
                    for (int i = 0; i < data.size(); i++) {
                        sb.append(data.get(i).name).append("\n");
                    }

                    tv_data.setText(sb.toString());
                    requesting = false;
                }

                @Override
                public void onError(Throwable e) {
                    // 显示错误
                    tv_data.setText(&
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值