kotlin 用协程做网络请求_中国电信营业厅: 感受 Kotlin 的 quot;加速度quot;

"我们手上是一个很成熟的项目,所以毫无疑问需要保留 Java 代码,目前只会在新开发的页面中使用 Kotlin,并已经感受到了它带来的便利。随着功能的迭代,我们相信更多的功能会转而使用 Kotlin。"—— 付迎鑫,电信营业厅技术负责人
中国电信电子渠道运营中心,属于中国电信三大主渠道之一,负责电信线上渠道的管理与运营。电信营业厅 app 则是中国电信线上渠道的主要入口。目前该应用的注册用户超过 2 亿,月活跃用户接近 6,000 万,月交易额在 10 亿以上。

电信营业厅应用的技术团队所面临的挑战,基本都和 "速度" 有关:

  • 电信营业厅 app 不是简单的工具应用,而是中国电信在线服务的官方品牌,并基于这个定位打造成了包括电商、互联网直播、阅读、音乐、影视、游戏、资讯、生活服务、公益事业的综合服务平台。要确保如此繁多的功能都流畅稳定地运行,对技术团队的开发效率都有十分高的要求。

  • 庞大的用户群体也使得应用运行的硬件和平台十分多样,技术团队需要跟得上用户们更换新设备、更新操作系统的速度。

  • 大型应用自然也会有庞大的历史资产,一旦需要对这些资产进行迭代,也需要尽可能降低时间成本。

而 Kotlin 带来的 "加速度",则让开发团队切实感受了一把 "推背感"。

第一脚油门总是需要慎重

2017 年上海,开发团队在谷歌开发者大会上了解到 Kotlin 技术框架已经日趋成熟,在看到很多主流应用纷纷开始使用 Kotlin 之后,团队便决定将 Kotlin 作为重点研究和学习的方向,并开始定期举办内部的学习和分享活动。7872e727f7787d247912c06501b59b1d.png

△ 电信营业厅技术团队核心成员于谷歌开发者大会。

左起: 付迎鑫 (电信营业厅技术负责人)、刘峻宇 (电信营业厅星播客项目经理)、曾皓 (电信营业厅 Android 项目经理)、张熠 (电信营业厅 Android 项目经理)、黄森燊 (电信营业厅 Android 开发工程师)但对开发者们来说,感受一门语言最直接的方式,依然还是上手开发。于是团队决定先在中国电信渠道中心的内部应用 "电渠报表" 中使用 Kotlin 作为主打开发语言。十分简洁的语法,对 lambda 表达式的支持,以及充分考虑了现代编程需求的架构,让团队 "打开了新世界的大门"。之后 Kotlin 很快就出现在了中国电信渠道中心的各个核心业务中,包括本文开头提到的电信营业厅应用,以及电信星播客应用。
"目前来看,项目整体已经有 20% 在使用 Kotlin,开发新功能的话 50% 的代码都是 Kotlin。"—— 付迎鑫,电信营业厅技术负责人

bdf1bb291c7d5d5e941855531521b9e7.png

△ 用来 "小试牛刀 的电渠报表应用

开得快,开得稳

其实很多时候,"快" 和 "稳" 并不矛盾——疾驰的跑车如果时不时爆胎,那显然也是跑不快的。空指针异常 (NPE) 导致的崩溃 (或 ANR) 就是让开发者和用户们沮丧的 "爆胎"。Kotlin 可以保护项目避免对可空类型进行误操作。如果类型检测正确,编译器还会进行自动类型转换,NPE 的出现概率降低了 80% 之多,项目稳定性和健壮性显著提高,更为对接和展示各省返回的业务数据打下了良好的基础。Kotlin 的另一个关键新特性是协程,它是一个轻量级的线程,一个线程中可以创建任意个协程,线程的执行和结束是由操作系统调度的,而协程可以让开发者手动控制其执行和结束。在项目中,团队会结合使用 Retrofit 和协程来处理网络请求,从而更好地控制任务的执行,这样会比单纯使用线程更加节省资源,也更加高效。在使用协程后,团队得以降低首页各个频道接口调用所需的资源,接口调用周期也更加可控。目前电信营业厅的首页和商城等核心页面都是通过 Kotlin 打造出流畅的使用体验。7937e063779dcc216523d37cb2af9eba.png401d33e6759e87beb89633db1a2cd4af.png△ 电信营业厅应用的首页和商城页面Kotlin 的 "快" 还体现在对代码的精简上。对于习惯了冗长 Java 代码的 Android 开发者来说,Kotlin 的 SAM (Single Abstract Method) 转换一下子缩减大量的模版代码可能会让他们不太适应——尤其是在通过 lambda 表达式实现 SAM 转换的时候。但更简洁、更有可读性的代码无疑可以让开发者的注意力更容易集中在业务逻辑上,而不是冗长的模版代码上。另一个能大量精简代码的地方是控件绑定,以前在 Activity 中需要为绑定控件编写大量的代码 (没错,就是 "findViewById")。引入 Jetpack View Binding 之后,ID 可以直接当做变量使用,在 ViewBinding 推出之后,配合 Kotlin 能写出更加安全和简洁的代码。

是时候看看远方的风景了

使用 Kotlin 带来的另一个好处,就是进入 Android 平台新功能的 "快车道"。

比如 Android 10 的时候平台增加了对折叠屏设备的支持,但想要让用户在折叠/展开设备时感觉流畅,免不了需要让应用妥善保存界面状态和支持配置变更,用 Java 编写这种 "保存/读取配置" 的工作虽然可行,但 Kotlin 的 lambda 解构方式能够帮助开发者更加方便地对需要保存的实体类和相关配置进行修改和读取,代码更加精简,可读性也更好。

a8227b7b62b73c80c3659344ec0a1e5a.gif△ 电信营业厅的折叠态和展开态在 Android 支持 5G 之后,开发团队可以通过 ConnectivityManager 类拓展的新方法为 5G 用户打造更加快速的网络体验。对那些流量敏感的用例,也可以直接使用网络连接 API 来检测设备是否进行了高带宽连接,并能检查连接是否计费。这时,开发团队大量使用了 Kotlin 的局部委托属性,使代码更加清晰明了。
  • 网络连接 APIhttps://developer.android.google.cn/reference/android/net/ConnectivityManager
  • 识别非计费状态https://developer.android.google.cn/reference/android/net/NetworkCapabilities.html#NET_CAPABILITY_NOT_METERED

来自团队的经验分享

从接触、了解 Kotlin,到逐步尝试,乃至正式采用,电信营业厅技术团队总结了一些第一手的经验,这里和大家分享。

  • 在使用 Kotlin 前,首先要对项目组成员对 Kotlin 的熟悉程度做一个简单的评估。对于新项目来说,需要对项目本身工作量进行评估,如果时间规划上比较充裕,可以考虑引入 Kotlin,这也可以让开发团队在实践中更加了解 Kotlin;而对于老项目来说,就需要综合考虑兼容性、稳定性、维护性等其他相关因素。

  • 需要为兼容性相关问题多预留一些解决时间,尤其是项目组成员对 Kotlin 还不那么熟悉的时候。

  • 如果在开发过程中发现最新的 Kotlin 需要升级到 AndroidX,需要慎重推进。因为升级 AndroidX 又会和很多第三方库产生冲突,这时只能通过与第三方进行协调来解决问题。

"我们会继续加大在 Kotlin 上的投入,目标是在新项目中 100% 使用 Kotlin。"—— 付迎鑫,电信营业厅技术负责人

更简洁、更高效、更现代的 Kotlin,已经让电信营业厅技术团队感受到了真实的 "加速度"。您是否已经准备好进入 Android 开发的 "快车道" 了呢?

c10ae3172341df29d60b9c93bc618fab.png

推荐阅读

76861707de7c53f7299ad52669c6dc76.png78246eb8d13bfdc6a9d243637cc190bf.png23fd39e69906b8dfa99874672f3bf1b9.pngbebc790d071ca6c0a286081eea5cc221.gif 点击屏末  | 查看更多开发者精彩故事

c2df937a8ee79fe1a455774e01f6c16c.png

9014626d14bff42ef21c04cb5fb28848.gif

cd791e82f1e8fc0385b30f4ea06bec40.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拖动验证码插件

拖动验证码插件 效果图: 在验证前,提交弹出验证失败,验证后弹出验证成功。 文件结构: css: #drag{ position: relative;background-color: #e8e8e8;width: 300px;height: 34px;line-height: 34px;text-align: center; …

matlab padarray函数零,matlab padarray函数

1padarray功能:填充图像或填充数组。用法:B padarray(A,padsize,padval,direction)A为输入图像,B为填充后的图像,padsize给出了给出了填充的行数和列数,通常用[r c]来表示。padval表示填充方法。它的具体值和描述如下…

如何将已有图片做成透明水印_如何用Photoshop在图片上添加透明水印?

我们经常会在网上看到一些漂亮的图片上有添加各种水印,添加水印可以让图片有一个标记,也可以防止别人盗用你的成果。那么图片上的这些水印是怎么添加的呢?今天,小编就给大家介绍用Photoshop软件来制作图片的透明水印的教程&#x…

[知了堂学习笔记]_网络基础知识_1.OSI参考模型(网络七层协议)

OSI参考模型是国际标准化组织ISO制定的模型,把计算机与计算机之间的通信分成七个互相连接的协议层,如图: 1.1各层功能 1、物理层 最底层是物理层,这一次负责传送比特流,它从第二层数据接收数据帧,并将帧的结…

微信小程序js数组初始化_微信小程序 数组(增,删,改,查)等操作实例详解...

微信小程序 数组(增,删,改,查)等操作最近在做一个小程序的demo。由于不向后台请求数据,所以就涉及到对本地数据的操作,也遇到了一些坑,本文就以数组的增删改查为例,给新手分享一些经验。首先这是…

Linux版本配置环境变量,如何linux环境下配置环境变量过程图解

jdk下载地址:在linux环境下的root同级目录下配置software目录将下载好的jdk上传到software文件夹里面(我使用的操作软件是)到software这个目录下.输入命令:cd /software输入命令:ll就可以看到我们的jdk包解压文件解压命令 tar xzvf jdk-8u111-linux-x64.tar.gz解压之…

linux的mysql本地yum安装_linux下使用yum安装mysql

mysql yum repository提供linux平台上面的MySQL server, client和其它组件的rpm包。它支持以下平台:基于EL5-, EL6-, 和 EL7-的平台,比如对应版本的ed Hat Enterprise Linux, Oracle Linux, CentOSFedora 22, 23, 24步骤:一、添加mysql yum r…

A.PHP读取txt文本文件并分页显示的方法

PHP读取txt文本文件并分页显示的方法作者:TomRobert 字体:[增加 减小] 类型:转载 时间:2015-03-11 我要评论这篇文章主要介绍了PHP读取txt文本文件并分页显示的方法,涉及php操作文件的技巧,具有一定参考借鉴价值,需要的朋友可以参…

python阈值计算_opencv python 图像二值化/简单阈值化/大津阈值法

pip install matplotlib1简单的阈值化cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表示如果像素值大于(有时小于)阈值则要给出的值. OpenCV提供不同类型的阈值,它由函…

奔腾双核linux服务器,Dell推出双核心奔腾服务器

来自业内的消息,Dell近日推出了一台采用Intel双核心 Pentium D的服务器,这将给小型服务器带来更强的运算能力。Dell PowerEdge SC430 主要面向小型企业客户,价格在499美元起。相比PowerEdge SC420,Dell为 PowerEdge SC430 装配了两…

EasyPlayerPro Windows流媒体播放器(RTSP/RTMP/HTTP/HLS/File/TCP/RTP/UDP都能播)发布啦

EasyPlayerPro简介 EasyPlayerPro是一款全功能的流媒体播放器,支持RTSP、RTMP、HTTP、HLS、UDP、RTP、File等多种流媒体协议播放、支持本地文件播放,支持本地抓拍、本地录像、播放旋转、多屏播放等多种功能特性,核心基于ffmpeg,稳…

github 思维导图开元软件_Mymind教学系列--Github上的免费且强大思维导图工具-(一)...

How many 0‘s?Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 2844Accepted: 1506DescriptionA Benedict monk No.16 writes down the decimal representations of all natural numbers between and including m and n, m ≤ n. How many 0‘s will he write dow…

linux jlink软件安装,LINUX下安装JLINK

确认是否安装libusb$ dpkg -l | grep libusb如果有libusb相关信息,说明已经安装了$ dpkg -l | grep libusbii libusb-0.1-4 2:0.1.12-20 userspace USB programming libraryii libusb-1.0-0 2:1.0.9~rc3-2ubuntu1 userspace USB programming libraryii libusb-dev 2…

tcpdump记录

tcpdump -i eth0 -nn -A -X host 192.168.20.82 and port 9080 -i:interface 监听的网卡。-nn:表示以ip和port的方式显示来源主机和目的主机,而不是用主机名和服务。-A:以ascii的方式显示数据包,抓取web数据时很有用。…

abortonerror_如何在多项目目录顶层的Android Gradle Plugin中禁用lint abortOnError

我有一个顶级的Android Gradle项目.这个项目下面嵌套了多个子项目(有时它们是2级深),即:top level project|project1vendor libraries|lib1lib2lint正在中断一些图书馆项目的建设.我可以编辑每个图书馆项目的build.gradle来解决问题android {lintOptions {abortOnEr…

linux权限源码分析,Linux基础之文件权限详解

Linux中对于权限的制定虽然没有Windows的那么精细,但是如果你了解并掌握Linux中文件的权限知识,也可以像Windows那样对权限做到精确配置。Linux中的文件权限是什么?如何查看Linux中的文件权限[[email protected] test]# ll -d /test/drwxr-xr…

Vue工程模板文件 webpack打包

1、github github地址:https://github.com/MengFangui/VueProjectTemplate 2、webpack配置 (1)基础配置webpack.base.config.js const path require(path); //处理共用、通用的js const webpack require(webpack); //css单独打包 const Ext…

flutter的按钮如何变为不可选中_如何在Flutter中禁用按钮?

小编典典我想你可能要出台一些辅助功能,以build您的按钮,以及与一些属性键关机的沿有状态的部件。使用StatefulWidget / State并创建一个变量来保存您的条件(例如isButtonDisabled)最初将其设置为true(如果您要这样做)呈现按钮时,请勿将onPre…

linux下toe网卡驱动,toe命令是干什么的,有没有大神解答一下

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼[lHP14 ~]$ toe -as--> /etc/terminfo----> /usr/share/terminfo--*-: Eterm Eterm with xterm-style color support (X Window System)--*-: Eterm-256color Eterm with xterm 256-colors--*-: Eterm-88color Eterm with 88…

ALSA声卡笔记2---ASoC驱动框架

1、简单了解一下ASOC 在嵌入式系统里面的声卡驱动为ASOC(ALSA System on Chip) ,它是在ALSA 驱动程序上封装的一层 分为3大部分,Machine,Platform和Codec ,三部分的关系如下图所示:其中Machine是指我们的…