登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

在 Kotlin 的 Android 项目中使用 Retrofit+RxJava [复制链接]

2017-9-4 16:07
AlonMessi 阅读:10419 评论:1 赞:0
Tag:  

众所周知,在今年的 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 的工作。

分享到:
我来说两句
facelist
您需要登录后才可以评论 登录 | 立即注册
所有评论(1)
kengsirLi 2017-9-7 14:42
支持一下
回复

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区

广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

返回顶部