众所周知,在今年的 Google I/O 上宣布了将 Kotlin 作为 Android 开发的官方支持语言。
今天这里就介绍下如何在用 Kotlin 的 Android 项目中使用 Retrofit(Retrofit 可以说是最受欢迎的网络第三方库,即使是 Google 也在他们的代码示例中用到了它)。
在今天的这篇文章中,我们将讨论如果通过 Retrofit + RxJava + Kotlin 在项目中使用 REST API,也就是大家几乎每天都会做到的事 - API 调用。
0. 准备工作
开发环境:Android Studio 3.0
了解基本的 Kotlin 相关知识。
1. 添加依赖
在 app-module 的 build.gradle
文件中添加依赖:
dependencies { // retrofit compile "com.squareup.retrofit2:retrofit:2.3.0" compile "com.squareup.retrofit2:adapter-rxjava2:2.3.0" compile "com.squareup.retrofit2:converter-gson:2.3.0" // rxandroid compile "io.reactivex.rxjava2:rxandroid:2.0.1"}
2. 创建数据类
在这里我们以 Github API 为例先创建 POJO,用 Kotlin 来创建数据类非常的简单:
3. 创建 API Service Interface
这一步里我们创建 API 接口用于发起请求并获取响应。
interface GithubApiService { @GET("search/users") fun search(@Query("q") query: String, @Query("page") page: Int, @Query("per_page") perPage: Int): Observable<Result> /** * Companion object to create the GithubApiService */ companion object Factory { fun create(): GithubApiService { val retrofit = Retrofit.Builder() .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl("https://api.github.com/") .build() return retrofit.create(GithubApiService::class.java); } }}
然后我们可以这样来使用:
val apiService = GithubApiService.create()apiService.search(/* search params go in here */)
注意其中我们用到了 companion object 来修饰 Factory,那么这个 companion object 是干什么用的呢?
首先,在 Kotlin 中使用单例模式非常的简单,也就是用 object:
object SearchRepositoryProvider { fun provideSearchRepository(): SearchRepository { return SearchRepository() }}
object 关键字声明的对象将在第一次被访问时被初始化,也就是懒汉式单例。
而 companion 这个名称可就值得一聊了,最早 companion object 被叫过 class object 和 default object。因为 Java 类中的 static 属性和方法,按逻辑上严格说来其实不是类的一部分。因此,Kotlin 团队就思考怎么来更好的说明这种关系,经过详细的考虑之后选定了 companion。
感兴趣的同学可以看看官方 blog:Upcoming Change: “Class Objects” Rethough
因此,Java 中的 static 属性、方法,在 Kotlin 中可以用 companion object 来实现。
4. 创建 Repository
为了保证尽可能的抽象,我们创建一个 repository 来调用上面的 GithubApiService。在我们的这个 demo 中,我们通过 Github API 来查找位于 Lagos 的 Java 程序员:
location:Lagos+language:Java。
代码看起来像这样:
class SearchRepository(val apiService: GithubApiService) { fun searchUsers(location: String, language: String): Observable<Result> { return apiService.search(query = "location:$location+language:$language") }}
5. 用 RxJava 进行请求并响应 API 回调
到这里准备工作就差不多了,就可以用 RxJava 来请求数据并响应数据了:
val repository = SearchRepositoryProvider.provideSearchRepository()repository.searchUsers("Lagos", "Java") .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe ({ result -> Log.d("Result", "There are ${result.items.size} Java developers in Lagos") }, { error -> error.printStackTrace() })
这样,我们就完成了在用 Kotlin 的 Android 项目中使用 Restrofit 调用 REST API 的工作。