最近帮一个朋友上架,代码发过来,发现需要一些改动,主要是在APP中获取数据的方式和传统桌面有着一些区别的。
- 需要服务端接口
在传统桌面程序中,你可以直接连接数据库来获取数据,比如用ADOConnection+ADOQuery查询数据库。
ADOConnection这种属于长连接,需要一直与数据库保持连接,但是用户在手机上会不断的切换不同的应用,一会儿看会微信,一会儿刷会抖音,这时,我们开发的APP就会被系统挂起在后台并断开与数据库的连接,当用户再次进入到我们的APP的时候,与数据库的网络连接已经断开了,需要重新连接了,这比较麻烦。
调用服务端HTTP接口所使用的是短连接,比如用NetHttpClient或者Indy组件去调用,我们每调用一次接口都会重新连接服务端,不用考虑如何与服务端保持连接。所以,App下面我建议你使用调用服务端HTTP接口的方式来获取数据。
传统直接在客户端查询数据库的方式我们称之为C/S模式,是两层框架,如果改成调用服务端接口,也就变成是我们常说的三层框架了,我们可以把获取数据和保存数据的业务逻辑统一放在服务端进行处理了,这样业务逻辑发生的改变或者产生的问题我们不需要升级客户端去处理,而是只需要升级服务端就可以了,客户端变成了一个只是展示数据和提交数据的壳,你的软件今后加入H5、小程序等,无需再重写一次逻辑,直接调用现成的接口就可以了。
怎么样写服务端接口呢?Delphi下面有很多三层控件,比如樵夫的快驴、火神中间件、国外的KBMMW等。我自己用的是KBMMW,它的框架特别简单稳定,你写好一个过程,就相当于自动添加了一个接口,比如:
那么就可以用IdHttp或都跟NetHttpClient组件
去访问”http://服务器:端口/服务名/user_refresh_content?参数名值列表”来调用这个接品了。
而且洞主和KBMMW的作者关系特别好,原价4000多一年吧,洞主帮我们谈下来的团购价是1400左右一年。有使用上的问题还能请教无所不知的洞主大神。
- 客户端需要在线程中获取数据
在传统桌面程序中,你获取程序,比如一个SQL查询,如果数据量特别大,耗时特别久,程序卡就卡吧,卡一会儿总能恢复响应,但是在APP下,对不住了,直接卡死无响应,不要想着过一会能恢复。并且通过网络获取数据的代码必须放在线程中去执行,这也主要是因为手机系统为了用户体验所作出的要求。
在传统桌面程序可能比较少的接触到线程,在老版本的Delphi中,如果要使用线程,需要从TThread中继承并覆盖它的Execute方法,比如:
但是新版的Delphi就相当方便了,可以直接使用匿名线程+匿名方法,比如:
注意后面的Start,不然你只是创建了一个线程但并没有启动它。
注意了,如果你在线程中要操作界面控件,还是需要做一下同步处理的,也是比较简单,用TThread.Synchronize包一个就可以了:
- Android下需要通过配置才能访问明文Http
你会发现你写的http接口在Android下访问不了,因为用的API29版本的手机默认拒绝应用程序使用明文流量的请求,只需要改工程目录下面的AndroidManifest.template.xml
在Application节点中加入android:usesCleartextTraffic=”true”即可
- 数据乱码
有些服务端框架,是直接传过来一个内存表给客户端使用,那么这时要注意了,有时候你在桌面程序上表现的都很正常,但是到了手机上就乱码了。
好巧不巧,这次苹果上架,我就遇到了,APP在Windows上和Android并且在我的苹果手机上都正常,但是到了苹果上架审核那帮子人手里就乱码了,后面我把地区和语言改成美国才把Bug重现出来。
最终是因为是服务端接口那边用的是SQLServer数据库,并且表中有char和varchar字段,所以就会乱码,把字段类型改成nchar和nvarchar就解决了。
有些服务端框架则是传Json格式的数据给客户端,就没有这个问题,Json本身会对中文进行编码和解码。
我能想到的暂时就这些了,非常欢迎得到大家的指点和批评!
直接回复公众号我就能收到。