平安科技“壹企业”携手深圳商会 畅谈“互联网+”趋势_励志网

平安科技“壹企业”携手深圳商会 畅谈“互联网+”趋势

2018-05-25 16:58 来源:励志网

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

全民健身多管齐下河北还将从这些方面着手↓↓↓↓

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

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

方法onResponse()的参数out仅仅是为了避免多次创建小对象,对应debug构建,倒也没太大意义。

publicclassWheelApiStrategyimplementsIMockApiStrategy{@OverridepublicvoidonResponse(intcallCount,Responseout){if(out==null)return;intstep=callCount%10;switch(step){case0:case1:case2:case3:out.state=Response.STATE_SUCCESS;break;case4:case5:out.state=Response.STATE_SERVER_ERROR;break;case6:case7:out.state=Response.STATE_SUCCESS;break;case8:case9:out.state=Response.STATE_NETWORK_ERROR;break;}out.delayMillis=700;}}

默认的项目代码是在src/main/java/目录下,创建目录/src/debug/java/来放置只在debug构建时编译的代码。在/src/release/java/目录下放置只在release构建时编译的代码。

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

静态方法getMockApi()根据传递的接口类型信息从mockApis中获取可能的mock实例,mockApis中注册了需要mock的那些接口的实现类对象。

publicclassMockApiManager{publicstaticTgetMockApi(ClassdataApiClass){returnnull;}}

省、市成立冰雪项目协会,张家口、承德市50%以上的县(市、区)成立冰雪项目协会、50%以上的社区建有季节性冰雪体育健身站(点)、30%以上乡镇(街道)建有冰雪体育组织。

publicclassMockApiManager{privatestaticfinalMockApiManagerINSTANCE=newMockApiManager();privateHashMapmockApis;privateMockApiManager(){}publicstaticTgetMockApi(ClassdataApiClass){if(dataApiClass==null)returnnull;Stringkey=dataApiClass.getName();try{Tmock=(T)getInstance().mockApis.get(key);returnmock;}catch(Exceptione){returnnull;}}privatevoidinitApiTable(){mockApis=newHashMap();mockApis.put(ITaskApi.class.getName(),newMockTaskApi());}privatestaticMockApiManagergetInstance(){if(INSTANCE.mockApis==null){synchronized(MockApiManager.class){if(INSTANCE.mockApis==null){INSTANCE.initApiTable();}}}returnINSTANCE;}}

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

publicclassTask{publicStringname;}

开展更加广泛深入冰雪运动

为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块。本篇文章就尝试为使用gradle的android项目设计实现MockApi。

因为最终release构建时是不需要任何mock接口的,所以此时getMockApi()一律返回null。也没有任何和提供mock接口相关的类型。

IMockApiStrategy接口IMockApiStrategy的作用就是抽象对请求返回不同响应结果的策略,响应结果由IMockApiStrategy.Response表示。

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

2020年,全省城镇居民每800人、农村每1500人中至少有1名社会体育指导员;全省基层站点数量超过3万个,95%以上的健身站点配有社会体育指导员。

每个市至少建成1个高标准的冰雪项目场地,有条件的县(市、区)要建设滑雪场或室内滑冰馆。

为了简化代码,抽象基类BaseMockApi完成了大部分公共的逻辑。

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

#p#分页标题#e#publicclassMainActivityextendsActivity{privateTextViewtv_data;privatebooleanrequesting=false;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_data=(TextView)findViewById(R.id.tv_data);getData();}privatevoidgetData(){if(requesting)return;requesting=true;ITaskApiapi=DataApiManager.ofTask();if(api!=null){api.getTasks(newDataApiCallback(){@OverridepublicvoidonSuccess(Listdata){//显示数据StringBuildersb=newStringBuilder("请求数据成功:\n");for(inti=0;i

publicinterfaceDataApiCallback{voidonSuccess(Tdata);voidonError(Throwablee);voidonStart();}

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

  2.界面设计简洁大方:界面设计简洁大方,用户进入app的第一印象就是舒适大方的,会增加用户的好感。

全省每年举办国际冰雪赛事2项以上,国家级赛事5项次以上,举办冰雪活动150次以上。

UI层通过DataApiManager来获得各个DataApi接口的实例。也就是在这里,会根据当前项目构建是debug还是release来选择性提供MockApi或最终的DataApi。

设计过程下面从分层设计、可开关模拟模块、不同网络请求结果的制造这几个方面来阐述下模拟接口模块的设计。为了表达方便,这里要实现的功能表示为“数据接口模拟模块”,对应英文为MockDataApi,或简写为MockApi,正常的数据接口模块定义为DataApi。

publicclassNetTaskApiimplementsITaskApi{@OverridepublicvoidgetTasks(DataApiCallbackcallback){//暂时没用实际的数据接口实现callback.onError(newException("数据接口未实现"));}}

不断增加公共体育场地设施

#p#分页标题#e#buildVariant使用gradle来构建项目时,可以指定不同的buildType,默认会有debug和release两个“构建类型”。此外,还可以提供productFlavors来提供不同的“产品类型”,如demo版,专业版等。每一种productFlavor和一个buildType组成一个buildVariant(构建变种)。可以为每一个buildType,buildVariant,或productFlavor指定特定的代码资源。

publicinterfaceITaskApi{voidgetTasks(DataApiCallbackcallback);}

这里利用buildType来为debug和release构建分别指定不同的MockApiManager类的实现。

MockApi的实现模拟数据接口的思路非常简单:根据请求的次数callCount,运行一定的策略来不断地返回不同的响应结果。响应结果包括“网络错误、服务器错误、成功”三种状态,而且还提供一定的网络时间延迟的模拟。

在DataApiManager中,获取数据接口实例时会根据开关变量MOCK_ENABLE判断是否可以返回mock实例。仅从功能上看是满足动态提供MockApi的要求了。不过,为了让最终release构建的apk中不包含多余的mock相关的代码,可以利用gradle提供的buildVariant。

当MOCK_ENABLE为true时,会去MockApiManager检索一个所需接口的mock实例,如果没找到,会返回真实的数据接口的实现,上面的NetTaskApi就是。倘若现在服务器还无法进行联合调试,它的实现就简单的返回一个服务器错误:

MockApiManagerDataApiManager利用MockApiManager来获取数据接口的mock实例。这样的好处是模拟数据接口的相关类型都被“封闭”起来,仅通过一个唯一类型来获取已知的DataApi的一种(这里就指mock)实例。这样为分离出mock相关代码打下了基础。

在UI层代码中,使用DataApiManager.ofTask()获得数据访问接口的实例。考虑到数据请求会是耗时的异步操作,这里每个数据接口方法接收一个DataApiCallback回调对象,T是将返回的数据类型。

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

科学规范健身指导队伍

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

BaseMockApi针对每一个数据访问接口,都可以提供一个mock实现。比如为接口ITaskApi提供MockTaskApi实现类。

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

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

作为一个默认的实现,WheelApiStrategy类根据请求次数,不断返回上述的三种结果:

publicclassDataApiManager{privatestaticfinalbooleanMOCK_ENABLE=BuildConfig.DEBUG;publicstaticITaskApiofTask(){if(MOCK_ENABLE){ITaskApiapi=MockApiManager.getMockApi(ITaskApi.class);if(api!=null)returnapi;}returnnewNetTaskApi();}}

闲置奢侈品交易APP的兴起是种新鲜事物,现在认可度还不算高。从国内目前的情况来看,奢侈新品的保有量还不到饱和,大多数人还不会因为太多而出手。另一方面,平台上的产品大多数款式和品牌比较老旧,而一些潮牌、大牌新款、新品牌,货源稀少,导致对用户的吸引力不足。

  东方智启科技作为专业的会计app开发公司,能为企业开发出用户喜欢的app。

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

接口DataApiCallback定义了数据接口请求数据开始和结束时的通知。

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

11月24日,河北省体育局正式对外发布了智能体育健身APP平台——“健身伙伴”。

到2020年,人均体育场地面积达到1.8平方米,城市街道和行政村健身设施实现100%全覆盖。

  3.提问方式多元化:会计和其他行业不一样,实操性很强,日常的会计学习和工作中经常接触到账本、单据,遇到这类问题提问就非常苦难。有别于普通的提问方式,会计app增加了白板提问功能,模拟课堂黑板,用户直接粘贴单据和账本,在上面圈划出问题,并且提交,专业人士就能通过白板进行一对一解答指导,帮助用户解决实际问题。

“健身伙伴”APP是一款公共体育服务软件,通过该手机软件,公众不仅可以查看周围的运动场馆和健身场所,还可以在线上实现对健身场所和时段的预约,邀请周围的朋友一同参与健身。目前“健身伙伴”APP已经与河北省体育局下属的上百所运动场馆和健身场所建立了线上直连,该软件目标是打造为公众健身真正的贴身伙伴。

release构建时的MockApiManager

publicinterfaceIMockApiStrategy{voidonResponse(intcallCount,Responseout);/***Mock响应返回结果,表示响应的状态*/classResponse{publicstaticfinalintSTATE_NETWORK_ERROR=1;publicstaticfinalintSTATE_SERVER_ERROR=2;publicstaticfinalintSTATE_SUCCESS=3;publicintstate=STATE_SUCCESS;publicintdelayMillis=600;}}

Response表示的响应结果包含结果状态和延迟时间。

DataApiManager根据分层设计,UI层和数据访问层之间的通信就是基于DataApi接口的,每个DataApi接口提供一组相关数据的获取方法。获取Task数据的接口就是ITaskApi:

  会计app功能特点介绍

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

  1.响应问题时间短:这款app不仅有产品团队来实现技术上的开发,也有庞大的师资团队来支撑和实现真人在线一对一对答的功能,用户提出问题之后,系统会在30秒之内响应问题,并且让专业人士进行解答。

  有部分会计问题对于专业的人员来说有时候都是一个难题,市场上的问答平台响应时间很长,不能马上帮助提问者解决问题。专门的会计app开发能够马上响应用户的问题,答案还是来自专业的会计人,专业又快速,提高用户获取答案的效率,也能迅速解决困扰自己的难题。

#p#分页标题#e#publicabstractclassBaseMockApi{protectedintmCallCount;privateIMockApiStrategymStrategy;privateResponsemResponse=newResponse();publicResponseonResponse(){if(mStrategy==null){mStrategy=getMockApiStrategy();}if(mStrategy!=null){mStrategy.onResponse(mCallCount,mResponse);mCallCount++;}returnmResponse;}protectedIMockApiStrategygetMockApiStrategy(){returnnewWheelApiStrategy();}protectedvoidgiveErrorResult(finalDataApiCallbackcallback,Responseresponse){Action1onNext=null;AndroidSchedulers.mainThread().createWorker().schedule(newAction0(){@Overridepublicvoidcall(){callback.onStart();}});switch(response.state){caseResponse.STATE_NETWORK_ERROR:onNext=newAction1(){@Overridepublicvoidcall(Objecto){callback.onError(newIOException("mocknetworkerror."));}};break;caseResponse.STATE_SERVER_ERROR:onNext=newAction1(){@Overridepublicvoidcall(Objecto){callback.onError(newIOException("mockservererror."));}};break;}if(onNext!=null){Observable.just(10086).delay(response.delayMillis,TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(onNext);}}publicvoidgiveSuccessResult(finalFunc0dataMethod,finalDataApiCallbackcallback,finalResponseresponse){AndroidSchedulers.mainThread().createWorker().schedule(newAction0(){@Overridepublicvoidcall(){Observable.create(newObservable.OnSubscribe(){@Overridepublicvoidcall(Subscriber据了解,虽然闲置奢侈品交易APP都将保真做为赖以生存的根本,但也不是家家都做得好。时尚买手表示,大部分平台依然服务不到位。比如,有的交易平台仅仅依靠卖家上传的图片来进行首次审核,经过平台检定合格的货品直接寄送给买家,不接受任何退换货。

而在款式上,最受消费者们青睐的是品牌的经典款,比如搞怪有趣的芬迪的小怪兽、华伦天奴迷彩、纪梵希罗威纳犬、路易威登的老花格纹等。

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

通过为debug和release构建提供不同的MockApiManager代码,就彻底实现了MockApi代码的动态添加和移除。

debug构建时的MockApiManager

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

责编: