作者:Antonio Leiva

时间:Apr 18, 2017

原文链接:https://antonioleiva.com/retrofit-android-kotlin/

这是又一个例子,关于怎样在Kotlin中使用Java使用过的相同库。

Retrofit是一个库,它极大地简化了请求API,在这个例子中我计划教你怎样将其与一些LastFM API请求集成。你能够读到运行在Bandhook Kotlin创库全部代码。

Kotlin中的Retrofit 2

Kotlin代码是非常类似我们在Java中用的。我们将看到更多的细节有哪些不同,而且,你会发现这一切都是很简单和直观的。

你还会看到我们也将创建一些非常实用的扩展函数。

构建build.gradle

我在这里不会解释太多,而你需要将下面指令加入到build.gradle中:

 compile "com.squareup.okhttp3:okhttp:$okhttpVersion"
compile "com.squareup.okhttp3:logging-interceptor:$okhttpVersion" compile ("com.squareup.retrofit2:retrofit:$retrofitVersion"){
// exclude Retrofit’s OkHttp peer-dependency module and define your own module import
exclude module: 'okhttp'
}

第一个依赖关系包括OkHttp最后的版本和日志记录拦截器,它能够用于调试。

接着加Retrofit(不包括OkHttp,这样我们控制我们实用的版本),Gson转换器转换请求给类。

创建通讯接口

这是Retrofit的中枢神经部分。这是你指定的请求结构,将需要匹配的API

 interface LastFmService {

     @GET("/2.0/?method=artist.search")
fun searchArtist(@Query("artist") artist: String): Call @GET("/2.0/?method=artist.getinfo")
fun requestArtistInfo(@Query("mbid") id: String, @Query("lang") language: String): Call @GET("/2.0/?method=artist.gettopalbums")
fun requestAlbums(@Query("mbid") id: String, @Query("artist") artist: String): Call; @GET("/2.0/?method=artist.getsimilar")
fun requestSimilar(@Query("mbid") id: String): Call @GET("/2.0/?method=album.getInfo")
fun requestAlbum(@Query("mbid") id: String): Call
}

它十分简单。它用符号标识请求的类型,然后请求的参数作为参数的函数

在Retrofit 2中,我们需要返回调用对象类型。

通讯服务的初始化

首先,你能够按如下初始化OkHttp client端:

 val client = OkHttpClient().newBuilder()
.cache(cache)
.addInterceptor(LastFmRequestInterceptor(apiKey, cacheDuration))
.addInterceptor(HttpLoggingInterceptor().apply {
level = if (BuildConfig.DEBUG) Level.BODY else Level.NONE
})
.build()
}

这里我们看到了apple函数的使用,它将帮助我们以构建者风格初始化拦截器,不需要为类实现构建者的任何类型。

LastFmRequestInterceptor没有什么了不起,但是你能够到GitHub上找到。服务器端的创建于Java有些不同:

val retrofit = Retrofit.Builder()
.baseUrl("http://ws.audioscrobbler.com")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build() val lastFmService = retrofit.create(LastFmService::class.java)

建立你的第一个请求

由于需要调用Retrofit 2,它成为一点冗余代码:

 val call = lastFmService.requestAlbums(mbid, name)
val result = call.execute().body()
val albums = AlbumMapper().transform(result.topAlbums.albums)

然而,幸亏有扩展函数,我们能够在Call创建一个函数,提取值,就如同这样:

 val albums = lastFmService.requestAlbums(mbid, name).unwrapCall {
AlbumMapper().transform(topAlbums.albums)
}

非常简单,对面?

unwrapCall的格式是什么?

 inline fun <T, U> Call.unwrapCall(f: T.() -> U): U = execute().body().f()

它是扩展Call类的函数。它将执行请求,提取body,使其(它将是U类型)执行函数f()。

在上面例子中,TLastFmResponseUList

结论

用这个例子,我想要向你再次展示任何你知道的,且喜欢的Java库都能够在Kotlin中使用,毫无问题

这非但没有使事情变得更复杂,而是在大多数情况下,简化语言代码。

准备好学习如何建立你的第一个项目,就去阅读免费指南,或者从头学习如何创建一个完整的应用程序,就直接获取这本书

在Android上,怎样与Kotlin一起使用Retrofit(KAD21)的更多相关文章

  1. 在Android上运用Anko和Kotlin开发数据库:SQLite从来不是一件轻松的事(KAD25)

    作者:Antonio Leiva 时间:Mar 30, 2017 原文链接:https://antonioleiva.com/databases-anko-kotlin/ 事实告诉我们:在Androi ...

  2. 【转】Android世界的Swift - Kotlin语言

    最近Oracle又在和Google撕的厉害,才知道还有这么Kotlin在Android像Swift在Mac的地位一说. Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计 ...

  3. 在Android上编写模块化项目(翻译)

    来源博客:Wang Jie's Blog 本文链接:http://blog.wangjiegulu.com/2018/02/13/writing_a_modular_project_on_androi ...

  4. Android平台的Swift—Kotlin

    WeTest 导读 Kotlin 已经出来较长一段时间了,有些同学已经对Kotlin进行了深入的学习,甚至已经运用到了自己的项目当中,但是还有较多同学可能只是听过Kotlin或简单了解过,这篇文章的目 ...

  5. 如何正确的在 Android 上使用协程 ?

    前言 你还记得是哪一年的 Google IO 正式宣布 Kotlin 成为 Android 一级开发语言吗?是 Google IO 2017 .如今两年时间过去了,站在一名 Android 开发者的角 ...

  6. 通杀所有系统的硬件漏洞?聊一聊Drammer,Android上的RowHammer攻击

    通杀所有系统的硬件漏洞?聊一聊Drammer,Android上的RowHammer攻击 大家肯定知道前几天刚爆出来一个linux内核(Android也用的linux内核)的dirtycow漏洞.此洞可 ...

  7. 在Android上使用qemu-user运行可执行文件

    在Android上使用qemu-user运行可执行文件 作者:寻禹@阿里聚安全 前言 QEMU简要介绍: QEMU可以解释执行可执行程序.既然QEMU可以解释执行可执行程序,那么QEMU就能够知道执行 ...

  8. 编译可在Android上运行的qemu user mode

    前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的”NDK”若无特殊说明均指”Android NDK”. 下文中”$NDK ...

  9. 系列篇|编译可在Android上运行的依赖库(一):glib库

    前言 这是系列文章,它们由<编译可在Android上运行的glib库>及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出.由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库 ...

随机推荐

  1. 【luogu P3128 [USACO15DEC]最大流Max Flow】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3128 菜 #include <cstdio> #include <cstring> ...

  2. IPv4和IPv6的兼容问题

    一网络拓扑 Ipv6网络1 路由器A IPv4网络 路由器B IPv6网络2 二知识补充 [注]双协议栈主机(路由器A.B)通过域名解析器区分传过来的是IPv4还是IPv6 三处理技术 双协议栈 Ip ...

  3. iOS自动打开闪光灯

    现在好多应有都具备扫码功能,为了减少用户操作,一般会在光线比较暗的时候,自动打开闪光灯: 1.导入头文件 #import <AVFoundation/AVFoundation.h> #im ...

  4. 【原创】os.chdir设置的工作路径和sys.path之间到底是个啥关系?

    转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9390455.html   直接放上测试后的结论(测试代码和截图过多,有兴趣的小伙伴可自己测试,未来看情况 ...

  5. Percona-Tookit工具包之pt-table-checksum

      Preface       The master-slave replication is commonly used in our product evironment.On account o ...

  6. js继承的几种方法和es6继承方法

        一.原型链继     1.基本思想     利用原型链来实现继承,超类的一个实例作为子类的原型     2.具体实现     function F() {}     //原型属性,原型方法: ...

  7. thinkphp发送邮箱(以thinkphp5作为示例)。

    第一步:设置我们的邮箱客户端授权码 第二步:下载相应的第三方类库(我这里用的PHPemail) 这是phpemailde 第三方类库的文件下载地址:https://github.com/PHPMail ...

  8. Mysqldump自定义导出n条记录

    很多时候DBA需要导出部分记录至开发.测试环境,因数据量需求较小,如果原库的记录多,且表数量也多,在用mysqldump命令导出时可以添加一个where参数,自定义导出n条记录,而不必全量导出. 示例 ...

  9. mysql帐号不允许从远程登陆

    默认情况下,mysql帐号不允许从远程登陆,只能在localhost登录.本文提供了二种方法设置mysql可以通过远程主机进行连接. 一.改表法 在localhost登入mysql后,更改 “mysq ...

  10. pygame小游戏之坦克大战

    以前在学校的时候无聊的学了会pygame.看了大概一周的教学视频,做出来个坦克大战的小游戏 Python3.5  pycharm import pygame,sys,time from random ...