[Android]使用Kotlin開發Android(二)



以下內容為原創,歡迎轉載,轉載請注明
來自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4829007.html

使用Kotlin+OkHttp+RxJava進行網絡請求

代碼:https://github.com/wangjiegulu/KotlinAndroidSample

1. 需要

2. Kotlin搭建環境

見之前的文章:[Android]使用Kotlin+Anko開發Android(一)

3. Gradle添加相關依賴包:

compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'io.reactivex:rxjava:1.0.12'
compile 'io.reactivex:rxandroid:0.24.0'

4. 請求

一般的寫法如下:

Observable.defer({ ->
                Observable.just(OkHttpClient().newCall(
                        Request.Builder()
                                .url("https://github.com/wangjiegulu")
                                .get()
                                .build()
                ).execute())
            }).subscribeOn(Schedulers.newThread())
                    .map({r -> r.body().string()})
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ result -> Log.d(TAG, "request result: $result"); resultTv.setText("Http request succeed, see log") }, {throwable -> Log.e(TAG, "", throwable)});

5. 使用Kotlin語法糖進行簡化

1) 在String類中擴展http請求方法

我們希望在url(String)中增加一個方法,直接調用后構建一個http請求:

fun String.request(): Request.Builder = Request.Builder().url(this);

如上代碼,在String類中定義了一個request()方法,返回一個OkHttp的Request.Builder對象,並設置url為當前的String對象,即當前的url。

2) 在Request.Builder類中擴展執行http請求方法

調用String方法的request()方法之后,獲得了一個構建的Request.Builder對象,然后希望通過這個對象調用某個方法來執行http請求,於是繼續擴展:

fun Request.Builder.rxExecute(): Observable<Response> = Observable.defer({ Observable.just(OkHttpClient().newCall(this.build()).execute()) }).subscribeOn(Schedulers.newThread());

我們在Request.Builder類中定義了一個rxExecute()方法,這個方法中,會通過RxJava構建一個Obserable對象,Obserable對象中排出給觀察者的數據就是http執行完畢后的結果Response。並且指定了執行http請求所在的線程。

3) 優化后的調用方式

"https://github.com/wangjiegulu".request().get().rxExecute()
                    .map({ r -> r.body().string() })
                    .observeOnMain()
                    .subscribeSafeNext { result -> Log.d(TAG, "request result: $result"); resultTv.setText("Http request succeed, see log") }

如上:通過url構建Request.Builder,然后通過RequestBuilder構建一個Obserable,然后訂閱獲得排出的請求結果。

為了方便調用,又在Obserable中擴展了幾個方法:

fun <T> Observable<T>.observeOnMain(): Observable<T> = this.observeOn(AndroidSchedulers.mainThread())

fun <T> Observable<T>.subscribeSafeNext(onNext: (T) -> Unit): Subscription = this.subscribe(onNext, { t -> Log.e(TAG, "", t) }, {});

fun <T> Observable<T>.subscribeSafeCompleted(onCompleted: () -> Unit): Subscription = this.subscribe({}, { t -> Log.e(TAG, "", t) }, onCompleted);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM