Kotlin + Rxjava + Retrofit 使用

本文介绍了如何在Kotlin中使用Rxjava和Retrofit进行网络请求。首先创建Retrofit单例,接着定义请求服务,使用时结合具体的数据类。在Kotlin中,与Java的使用方式大同小异,主要差异体现在最后的调用部分。
摘要由CSDN通过智能技术生成

首先创建个retrofit的单列

/**
 * Created by JokAr on 2017/6/5.
 */
class NetworkConfig private constructor() {

    private val DEFAULT_TIMEOUT: Long = 15
    private val BASE_URL: String = "http://gank.io/api"

    var retrofit: Retrofit = initRetrofit()

    private object Holder { val INSTANCE = NetworkConfig() }
    companion object{
        val instance:NetworkConfig by lazy { Holder.INSTANCE }
    }
    private fun initRetrofit(): Retrofit {
        val interceptor = HttpLoggingInterceptor()
        if (BuildConfig.DEBUG)
            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
        else
            interceptor.setLevel(HttpLoggingInterceptor.Level.NONE)
        
        val client = OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .retryOnConnectionFailure(true)
                .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
                .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
                .build()

        return  Retrofit.Builder()
                .baseUrl(BASE_URL + "/")
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()
    }
}

然后创建请求service

/**
 * Created by JokAr on 2017/6/5.
 */
interface DataService {

    @GET("data/{type}/{count}/{pageSize}")
    fun getData(@Path("type") type: String,
                @Path("count") count: Int,
                @Path("pageSize") pageSize: Int)
            : Observable<HttpResult<ArrayList<DataEntities>>>
}

其中HttpResultDataEntities元素类为

/**
 * Created by JokAr on 2017/6/5.
 */
data class DataEntities(@SerializedName("_id") var _id: String,
                        @SerializedName("createdAt") var createdAt: String,
                        @SerializedName("desc") var desc: String,
                        @SerializedName("publishedAt") var publishedAt: String,
                        @SerializedName("source") var source: String,
                        @SerializedName("type") var type: String,
                        @SerializedName("url") var url: String,
                        @SerializedName("used") var used: Boolean,
                        @SerializedName("who") var who: String) : Parcelable {

    companion object {
        @JvmField val CREATOR: Parcelable.Creator<DataEntities> = object : Parcelable.Creator<DataEntities> {
            override fun createFromParcel(source: Parcel): DataEntities = DataEntities(source)
            override fun newArray(size: Int): Array<DataEntities?> = arrayOfNulls(size)
        }
    }

    constructor(source: Parcel) : this(
    source.readString(),
    source.readString(),
    source.readString(),
    source.readString(),
    source.readString(),
    source.readString(),
    source.readString(),
    1 == source.readInt(),
    source.readString()
    )

    override fun describeContents() = 0

    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest.writeString(_id)
        dest.writeString(createdAt)
        dest.writeString(desc)
        dest.writeString(publishedAt)
        dest.writeString(source)
        dest.writeString(type)
        dest.writeString(url)
        dest.writeInt((if (used) 1 else 0))
        dest.writeString(who)
    }
}
/**
 * Created by JokAr on 2017/6/5.
 */
data class HttpResult<T>(@SerializedName("error") var error: Boolean,
                         @SerializedName("results") var results: T?)

然后就是使用方法了

 NetworkConfig.instance
                .retrofit
                .create(DataService::class.java)
                .getData("Android", 10, 1)
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .map(HttpResultFunc())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    result ->
                    Log.d("Kotlin", result.toString())
                }, {
                    error ->
                    error.printStackTrace()
                }, {
                    Log.d("Kotlin", "onComplete")
                }, {
                    Log.d("Kotlin", "onStart")
                })

其中HttpResultFunc为:

/**
 * Created by JokAr on 2017/6/5.
 */
class HttpResultFunc<T> :Function<HttpResult<T>,T> {

    override fun apply(tHttpResult: HttpResult<T>?): T {
        if (tHttpResult != null) {
            if (tHttpResult?.error) {
                throw APIException()
            }
        }
        return tHttpResult?.results as T
    }
}

END

到此就结束了,跟在java中使用没多大区别,就只是在最后的subscribe有点区别,在代码中已注明



作者:JokAr_
链接:https://www.jianshu.com/p/b39c0061a1a8
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值