美文网首页kotlinKotlin
在kotlin中使用retrofit+rxjava2

在kotlin中使用retrofit+rxjava2

作者: JokAr_ | 来源:发表于2017-06-06 21:46 被阅读636次

    首先创建个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有点区别,在代码中已注明

    相关文章

      网友评论

        本文标题:在kotlin中使用retrofit+rxjava2

        本文链接:https://www.haomeiwen.com/subject/nsmnfxtx.html