zoukankan      html  css  js  c++  java
  • [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);
    
  • 相关阅读:
    矩阵旋转
    clang-format 规范及 Visual Stido Code 自定义格式化代码风格
    Windows 安装 MinGW-w64
    Linux配置Visual Stdio Code
    Ubuntu中安装eclipse
    Ubuntu安装JDK11
    Ubuntu安装搜狗输入法
    C/C++算术运算(类型使用)的注意事项
    闰年判断与日期计算
    查看变量类型
  • 原文地址:https://www.cnblogs.com/tiantianbyconan/p/4829007.html
Copyright © 2011-2022 走看看