精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用Kotlin高效地開(kāi)發(fā)Android App(一)

移動(dòng)開(kāi)發(fā)
最近我們?cè)谧鰠^(qū)塊鏈相關(guān)的錢包項(xiàng)目,新的App使用全新的技術(shù)棧。在Android中我們使用Kotlin+RxJava+Android Architecture Components,在iOS中使用Swift+RxSwift。本文不討論App的架構(gòu),只討論項(xiàng)目中所使用到的Kotlin的特性。

[[227035]]
星戰(zhàn)小兵.jpg

背景

最近我們?cè)谧鰠^(qū)塊鏈相關(guān)的錢包項(xiàng)目,新的App使用全新的技術(shù)棧。在Android中我們使用Kotlin+RxJava+Android Architecture Components,在iOS中使用Swift+RxSwift。本文不討論App的架構(gòu),只討論項(xiàng)目中所使用到的Kotlin的特性。

在Android的App中,可以毫不夸張地說(shuō),我們95%以上的代碼使用了Kotlin開(kāi)發(fā)的。由此,很有必要對(duì)這一階段使用Kotlin做一個(gè)簡(jiǎn)單的小結(jié)。

使用的Kotlin特性:

一.擴(kuò)展函數(shù)

Kotlin允許開(kāi)發(fā)者在不改變已有類的情況下,為某個(gè)類添加新的函數(shù)。這個(gè)特性叫做擴(kuò)展函數(shù)。

舉一個(gè)簡(jiǎn)單的例子。如果要關(guān)閉一個(gè)I/O流,使用Java可能是寫一個(gè)工具方法。

 

  1. /**  
  2. * 安全關(guān)閉io流  
  3. * @param closeable  
  4. */  
  5. public static void closeQuietly(Closeable closeable) {  
  6. if (closeable != null) {  
  7. try { 
  8.  closeable.close();  
  9. } catch (IOException e) {  
  10. e.printStackTrace();  
  11.  
  12.  

對(duì)Kotlin而言,可以對(duì)Closeable擴(kuò)展一個(gè)函數(shù)closeQuietly()。

 

  1. fun Closeable?.closeQuietly() {  
  2. try {  
  3. this?.close()  
  4. } catch (e: Throwable) {  
  5.  

之后,任何實(shí)現(xiàn)了Closeable接口的類,都可以使用它本身的closeQuietly()方法來(lái)關(guān)閉流。我們不再需要那個(gè)工具方法了。

在項(xiàng)目中,我們使用擴(kuò)展函數(shù)對(duì)Glide做了封裝,大大簡(jiǎn)化了Glide的使用。

 

  1. /**  
  2. * 占位符矩形  
  3. */  
  4. fun ImageView.load(url: String) {  
  5. get(url).placeholder(R.drawable.shape_default_rec_bg)  
  6. .error(R.drawable.shape_default_rec_bg) 
  7.  .into(this)  
  8.  
  9. /**  
  10. * 占位符圓角矩形  
  11. */  
  12. fun ImageView.loadRound(url: String) {  
  13. get(url).placeholder(R.drawable.shape_default_round_bg)  
  14. .error(R.drawable.shape_default_round_bg)  
  15. // .apply(RequestOptions.bitmapTransform(RoundedCornersTransformation(DisplayUtil.dp2px(context, 6f), 0))) 
  16.  .transform(RoundedCornersTransformation(DisplayUtil.dp2px(context, 6f), 0))  
  17. .into(this)  
  18.  /**  
  19. * 占位符圓形  
  20. */  
  21. fun ImageView.loadCircle(url: Drawable) {  
  22. get(url).placeholder(R.drawable.shape_default_circle_bg)  
  23. .error(R.drawable.shape_default_circle_bg)  
  24. .into(this)  
  25.  fun ImageView.loadCircle(url: String) {  
  26. get(url).placeholder(R.drawable.shape_default_circle_bg)  
  27. .error(R.drawable.shape_default_circle_bg)  
  28. .into(this)  
  29.  
  30. fun ImageView.get(url: String): GlideRequest = GlideApp.with(context).load(url)  
  31. fun ImageView.get(url: Drawable): GlideRequest = GlideApp.with(context).load(url) 

除此之外,我們還很多地方都用到了擴(kuò)展函數(shù)。

我順便更新了我的Kolin的工具類庫(kù),它包括各種utils和各種extension

https://github.com/fengzhizi715/SAF-Kotlin-Utils

二.尾隨閉包

一開(kāi)始我并不了解這個(gè)概念。偶然間我看到我們的小伙伴在使用RxBus時(shí),寫下了這樣的代碼:

  1. RxBus.get().register(LogoutEvent::class.java) { refresh() } 

當(dāng)時(shí)我感覺(jué)很疑惑,因?yàn)镽xBus是我寫的,記得沒(méi)有提供這樣的方法啊。點(diǎn)擊register()方法進(jìn)去看之后,發(fā)現(xiàn)register是這樣的:

 

  1. public Disposable register(Class eventType, Consumer onNext) {  
  2. return toObservable(eventType).observeOn(AndroidSchedulers.mainThread()).subscribe(onNext);  

由于使用了Kotlin,該register方法的使用可以簡(jiǎn)化成這樣:

 

  1. RxBus.get().register(LogoutEvent::class.java,{  
  2. refresh()  
  3. }) 

由于register()***一個(gè)參數(shù)是一個(gè)方法或者說(shuō)是一個(gè)閉包,可以把方法或者閉包提到最外面。變成項(xiàng)目中看到的樣子:

  1. RxBus.get().register(LogoutEvent::class.java) { refresh() } 

這就是尾隨閉包,可以讓代碼看起來(lái)更加簡(jiǎn)潔。

三.with的用法

with是將某個(gè)對(duì)象作為函數(shù)的參數(shù),在函數(shù)塊內(nèi)可以通過(guò) this 指代該對(duì)象。在函數(shù)塊內(nèi)可以直接調(diào)用對(duì)象的方法或者屬性。

 

  1. /**  
  2. * Calls the specified function [block] with the given [receiver] as its receiver and returns its result.  
  3. */  
  4. @kotlin.internal.InlineOnly  
  5. public inline fun with(receiver: T, block: T.() -> R): R {  
  6. contract {  
  7. callsInPlace(block, InvocationKind.EXACTLY_ONCE)  
  8.  
  9. return receiver.block()  

在使用with之前的某個(gè)Adapter

 

  1. class AppPublisherAdapter : BaseAdapter() {  
  2. override fun getLayoutId(viewType: Int): Int = R.layout.cell_app_publisher  
  3. override fun onBindViewHolderImpl(holder: BaseViewHolder, position: Int,content: BoundAppInfoResponse.AppInfo) {  
  4. holder.itemView.tv_game_name.text = content.name 
  5.  if (content.is_bound) {  
  6. holder.itemView.tv_bound_user_name.text = content.bound_user_name  
  7. holder.itemView.tv_bound_user_name.setTextColor(context.resources.getColor(R.color.color_bound_user_name))  
  8. else {  
  9. holder.itemView.tv_bound_user_name.text = context.getString(R.string.bind_on_account)  
  10. holder.itemView.tv_bound_user_name.setTextColor(context.resources.getColor(R.color.color_bind_on_account))  
  11.  
  12. holder.itemView.iv_game_icon.load(content.logo_url)  
  13.  

使用with之后,該函數(shù)塊可以省略"content."

 

  1. class AppPublisherAdapter : BaseAdapter() {  
  2. override fun getLayoutId(viewType: Int): Int = R.layout.cell_app_publisher  
  3. override fun onBindViewHolderImpl(holder: BaseViewHolder, position: Int, content: BoundAppInfoResponse.AppInfo) {  
  4. with(content) {  
  5. holder.itemView.tv_game_name.text = name  
  6. if (is_bound) {  
  7. holder.itemView.tv_bound_user_name.text = bound_user_name  
  8. holder.itemView.tv_bound_user_name.setTextColor(context.color(R.color.color_bound_user_name))  
  9. else {  
  10. holder.itemView.tv_bound_user_name.text = context.string(R.string.bind_on_account)  
  11. holder.itemView.tv_bound_user_name.setTextColor(context.color(R.color.color_bind_on_account))  
  12.  
  13. holder.itemView.iv_game_icon.load(logo_url)  
  14.  
  15.  

四.其他

這部分的內(nèi)容并不是Kotlin的特性,是我使用Kotlin開(kāi)發(fā)的工具。比如日志框架L以及Retrofit的日志攔截器。這些庫(kù),其實(shí)很早就開(kāi)發(fā)了,最近稍微升級(jí)了一下功能。

L的github地址:

  • https://github.com/fengzhizi715/SAF-Kotlin-log

Retrofit日志攔截器的github地址:

  • https://github.com/fengzhizi715/saf-logginginterceptor

日志攔截器的效果圖:

使用Kotlin高效地開(kāi)發(fā)Android App(一)
request的效果圖.jpeg

使用Kotlin高效地開(kāi)發(fā)Android App(一)
response的效果圖.jpeg

總結(jié)

Kotlin吸收了多種語(yǔ)言的優(yōu)點(diǎn),相對(duì)于Java有很多激動(dòng)人心的特性,極大地提高了開(kāi)發(fā)效率。本文介紹的特性也只是滄海一粟。接下來(lái),我會(huì)整理更多項(xiàng)目中所使用的Kotlin特性。

BTW,我在寫這篇文章的時(shí)候國(guó)內(nèi)***個(gè)錢包版本剛剛做完,開(kāi)始***輪測(cè)試。

責(zé)任編輯:未麗燕 來(lái)源: 簡(jiǎn)書(shū)
相關(guān)推薦

2010-03-03 15:06:52

Android 游戲開(kāi)

2017-05-22 11:09:53

KotlinAndroid

2021-03-08 07:46:53

Git開(kāi)源控制系統(tǒng)

2021-08-05 18:34:55

IntelliJ ID高效

2015-09-06 14:50:05

安卓app高效開(kāi)發(fā)

2014-04-08 10:22:29

Android高效開(kāi)發(fā)App

2021-01-18 13:17:04

鴻蒙HarmonyOSAPP

2023-11-28 08:22:05

goroutine語(yǔ)言

2024-01-08 09:00:00

開(kāi)發(fā)DSLKotlin

2022-05-11 09:51:10

云計(jì)算公共云

2013-05-28 14:39:25

Android開(kāi)發(fā)Android App

2021-01-28 14:53:19

PHP編碼開(kāi)發(fā)

2013-02-18 08:39:15

powershell

2018-06-20 11:00:06

云應(yīng)用開(kāi)發(fā)PaaS

2017-05-09 09:36:52

Android App高效顯示位圖

2016-11-23 08:10:16

Android St JRebel調(diào)試神器

2021-02-25 22:17:19

開(kāi)發(fā)技術(shù)編程

2019-09-27 12:44:03

數(shù)據(jù)建模企業(yè)數(shù)據(jù)存儲(chǔ)

2021-05-31 07:57:00

拼接字符串Java

2019-04-01 14:17:36

kotlin開(kāi)發(fā)Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产毛片av在线| 亚洲第一视频区| 国产h片在线观看| 国产欧美精品一区aⅴ影院| 国产精品久久久久久久久粉嫩av| 日韩免费av一区| 2023国产精华国产精品| 欧美视频中文在线看| 亚洲高清在线观看一区| 黄色美女一级片| 欧美a级一区二区| 欧美激情精品久久久久| 免费毛片视频网站| 精品国产乱码久久久久久樱花| 亚洲午夜久久久久久久久电影院| 欧美在线3区| 亚洲成人av综合| 免费的国产精品| 4p变态网欧美系列| 91视频免费在线看| 欧美日韩伦理| 日韩电影第一页| 夜夜爽久久精品91| 日本不卡一二三| 亚洲一级不卡视频| 中文字幕人成一区| 国产精品一二三区视频| 成人免费视频网站在线观看| 国产主播在线一区| 日韩免费不卡视频| 你懂的视频一区二区| 一区二区三区回区在观看免费视频| 亚洲一区二区三区四区av| 57pao成人永久免费| 欧美亚洲日本国产| 欧美 国产 小说 另类| heyzo中文字幕在线| 亚洲精品v日韩精品| 亚洲精品一区二区三区av| 久草在线青青草| 91亚洲国产成人精品一区二区三| 91免费看网站| 国产精品一区二区人人爽| 日韩精品一区第一页| 日本精品免费观看| 国产成人愉拍精品久久| 亚洲高清毛片| 久久久视频免费观看| 成年人午夜剧场| 欧美a级片网站| 欧美成人精品一区| 成年人av电影| 天天综合一区| 久久成人精品视频| 欧美黄色免费看| 午夜亚洲福利| 欧美高清第一页| 一区二区三区免费高清视频| 欧美日韩精品一本二本三本| 久久视频在线视频| 国产极品国产极品| 伊人久久亚洲美女图片| 性金发美女69hd大尺寸| 久久久久久91亚洲精品中文字幕| 国产精品一卡| 国产成一区二区| 96日本xxxxxⅹxxx17| 国产一区二区三区在线观看免费视频 | 午夜毛片在线| 一区二区中文视频| 水蜜桃在线免费观看| 性欧美video高清bbw| 亚洲伊人色欲综合网| 免费看国产曰批40分钟| 成人小电影网站| 欧美色精品在线视频| 蜜臀一区二区三区精品免费视频| 欧美激情不卡| 精品人伦一区二区色婷婷| 中文字幕av观看| 精品成人影院| 久久精视频免费在线久久完整在线看| 日韩三级久久久| 欧美天天在线| 国产成人激情视频| 国产精品午夜福利| 99久久精品国产导航| 日本午夜精品一区二区| 国产在线观看91| 五月婷婷综合在线| 超碰在线播放91| 99这里只有精品视频| 亚洲精品一区在线观看香蕉| gv天堂gv无码男同在线观看| 欧美在线亚洲| 国产成人精品在线播放| 亚洲AV无码精品色毛片浪潮| 91麻豆swag| 日本福利视频在线观看| 美女100%一区| 日韩一区二区在线看| 在线免费观看黄色小视频| 婷婷综合亚洲| 欧美在线视频一二三| 国产精品视频一二区| 99久久久免费精品国产一区二区| 亚洲人体一区| 在线看的毛片| 日韩一级成人av| 国产视频三区四区| 日韩午夜av在线| 91久久精品视频| 国内在线免费高清视频| 亚洲国产视频网站| 99中文字幕在线| 久9久9色综合| 午夜精品久久久久久久男人的天堂| 中文字幕av影视| 91麻豆.com| 人妻激情另类乱人伦人妻| 国产69精品久久| 亚洲精品一区中文| 国产成人精品亚洲男人的天堂| 久久 天天综合| 日产精品高清视频免费| 欧美aa在线| 亚洲国产精品字幕| 91免费公开视频| 蜜臀av性久久久久av蜜臀妖精| 久久国产欧美精品| 91九色在线播放| 日韩欧美一区在线| 紧身裙女教师波多野结衣| 蜜桃久久精品一区二区| 青娱乐一区二区| 欧美成人ⅴideosxxxxx| 亚洲国产99精品国自产| 黄色在线观看免费| 国产精品亚洲一区二区三区在线| 一区二区三区在线观看www| 日韩av超清在线观看| 亚洲精品一区二三区不卡| 日韩黄色精品视频| 成人一区二区视频| 欧美大黑帍在线播放| 免费精品一区| 久久的精品视频| 国产99对白在线播放| 亚洲日本一区二区| 天天色天天干天天色| 亚洲情侣在线| 5566av亚洲| 色呦呦在线看| 精品福利二区三区| www.国产成人| 久久久综合视频| 免费裸体美女网站| 第一会所亚洲原创| 91精品国产综合久久久久久久久| 日本在线天堂| 日韩欧美一级精品久久| 久久精品人妻一区二区三区| 成人av动漫在线| 丰满爆乳一区二区三区| 日韩美女精品| 国产精品三级久久久久久电影| 9色在线视频| 欧美一级搡bbbb搡bbbb| 久久久久久久久久久97| 91免费在线看| 亚洲77777| 综合天堂久久久久久久| 国产精品免费看一区二区三区| 美女视频在线免费| 国产一区二区免费| 91久久精品无码一区二区| 亚洲综合在线视频| 国产黄片一区二区三区| 麻豆成人免费电影| www.av毛片| 精品国产成人| 99久久国产免费免费| 伊伊综合在线| 久久精品国产视频| 欧美自拍第一页| 欧美少妇一区二区| 久久免费少妇高潮99精品| 26uuu亚洲| 亚洲小视频网站| 影音先锋久久资源网| 日韩在线电影一区| 中文字幕一区二区三区四区久久| 奇米4444一区二区三区| 成人影欧美片| 亚洲人在线视频| 性生活黄色大片| 欧美在线观看一二区| 妺妺窝人体色www在线下载| 久久久亚洲国产美女国产盗摄| 中文字幕12页| 久久久精品午夜少妇| 青少年xxxxx性开放hg| 天美av一区二区三区久久| 成人黄色av播放免费| 亚洲精品成人图区| 欧美高清一级大片| 色三级在线观看| 日韩高清av在线| av在线免费在线观看| 欧美综合色免费| 五月婷婷激情网| 一区二区三区日韩精品视频| 一级在线观看视频| 91免费版在线看| 在线播放av网址| 寂寞少妇一区二区三区| 黄色av免费在线播放| 国产一区二区三区成人欧美日韩在线观看| 二级片在线观看| 成人av动漫在线观看| 精品国产二区在线| 91大神精品| 91精品一区二区| 欧美高清影院| 国产精品高潮呻吟久久av野狼| 国产在线观看www| 久久视频在线播放| 欧美日本高清| 中文字幕在线成人| 国产在线视频网| 亚洲欧美成人网| 亚洲人妻一区二区| 欧美精品一区二区三区高清aⅴ| 国产三级漂亮女教师| 欧美日韩国产首页| 中文字幕乱码人妻二区三区| 91久久精品午夜一区二区| 国产精品一区二区三区四| 岛国av午夜精品| av大片在线免费观看| 大桥未久av一区二区三区| 国产精品suv一区二区三区| 亚洲成人综合在线| 国产精品99精品无码视| 亚洲午夜在线观看视频在线| 一区二区在线观看免费视频| 综合精品久久久| 超碰手机在线观看| 亚洲一区视频在线| av资源吧首页| 午夜视频一区在线观看| 日韩久久久久久久久| 天天爽夜夜爽夜夜爽精品视频 | 偷拍一区二区三区四区| 日韩美女黄色片| 一本色道亚洲精品aⅴ| 秋霞av一区二区三区| 色婷婷久久久久swag精品| 波多野结衣av无码| 欧美日韩国产一区二区三区地区| 亚洲无码久久久久| 日韩一级完整毛片| 亚洲国产成人精品一区二区三区| 精品国产一区二区三区忘忧草| 日本高清视频免费看| 日韩电影网在线| 国产综合在线观看| 久久精品国产91精品亚洲| 在线电影福利片| 国外成人在线视频| 电影天堂国产精品| 成人免费看吃奶视频网站| 亚洲综合影院| 欧美久久久久久久| 97精品国产一区二区三区| 日韩欧美一级在线| 国产欧美一区二区三区国产幕精品| av片中文字幕| 久久99久久久久| 免费观看污网站| 国产偷国产偷亚洲高清人白洁| 国产福利视频网站| 亚洲不卡一区二区三区| 人人妻人人爽人人澡人人精品| 欧美精选在线播放| 色wwwwww| 中文字幕欧美亚洲| 精品日韩av| 国产精品扒开腿做爽爽爽男男| av在线精品| 久久精品国产综合精品| 欧美freesextv| 欧美 丝袜 自拍 制服 另类| 免费高清成人在线| 怡红院一区二区| 中文字幕在线一区二区三区| 懂色av.com| 在线播放欧美女士性生活| 天天插天天干天天操| 日韩亚洲精品视频| 午夜激情在线播放| 99高清视频有精品视频| 国产在线日韩精品| 日本大片免费看| 毛片基地黄久久久久久天堂| 成人免费无码大片a毛片| 日韩理论片一区二区| 中文字幕亚洲精品一区| 欧美一区二区三区在线看| 看电影就来5566av视频在线播放| 色中色综合影院手机版在线观看| 日本综合久久| 久久国产精品久久| 国产一区日韩欧美| 999这里有精品| 欧美国产综合一区二区| 成人午夜视频在线播放| 欧美变态tickle挠乳网站| 麻豆tv入口在线看| 三年中文高清在线观看第6集| 视频国产一区| 国产xxxx振车| 老鸭窝一区二区久久精品| 青青草视频播放| 亚洲精品成人精品456| 在线观看国产精品入口男同| 亚洲激情电影中文字幕| jizzjizz亚洲| 91精品美女在线| 日本一区二区三区视频| wwwxxx黄色片| 91香蕉视频mp4| 久久不卡免费视频| 亚洲精品在线电影| 91精选在线| 91亚洲精品视频| 亚洲女同中文字幕| www.五月天色| 亚洲视频资源在线| 国产一区二区三区中文字幕| 中文字幕欧美专区| 国产亚洲人成a在线v网站| 激情小说综合网| 夜久久久久久| 精品无码在线视频| 精品欧美激情精品一区| 天天干在线观看| 91sa在线看| 亚洲警察之高压线| 国产xxxxx在线观看| 国产三级一区二区三区| 日本视频www色| 色爱av美腿丝袜综合粉嫩av| 国产精品蜜月aⅴ在线| 亚洲一卡二卡| 国产伦精一区二区三区| 欧美黑吊大战白妞| 亚洲成人黄色网址| 中老年在线免费视频| 日本高清一区| 麻豆视频一区二区| 波多野结衣爱爱视频| 欧美mv日韩mv亚洲| аⅴ资源天堂资源库在线| 麻豆精品传媒视频| 日韩av不卡一区二区| 国产福利视频网站| 亚洲第一免费网站| 免费观看欧美大片| 午夜精品一区二区在线观看的| 久久精品国产99| 久久久久久久久久久网| 精品亚洲aⅴ在线观看| 国产私拍福利精品视频二区| 一区二区三区欧美成人| 国产成人亚洲综合a∨猫咪| 国产成人在线播放视频| 中文字幕精品av| 91蝌蚪精品视频| 又色又爽又高潮免费视频国产| 国产精品国产a| 特级丰满少妇一级aaaa爱毛片| 国产精品第100页| 一区二区三区四区电影| 黄色国产在线观看| 7777精品伊人久久久大香线蕉最新版| 国产羞羞视频在线播放| 欧美一区二区三区四区五区六区| 国产综合久久久久久久久久久久| 国产中文字幕免费| 在线亚洲国产精品网| 国产精品毛片av| 国产精品一区二区小说| 亚洲国产一区二区三区| jizz在线免费观看| 国产亚洲一区在线播放| 激情综合色丁香一区二区| 97久久久久久久| 九色91av视频| 久久美女精品|