不知道Fuel的朋友可以看下下面这几篇文章,这里主要讲项目中的使用流程

GitHub地址

Kotlin网络库Fuel的设计之道

Kotlin实战之Fuel的高阶函数

接入AS:

    //fuel框架    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'    implementation "com.github.kittinunf.fuel:fuel-rxjava:$fuel_version"    implementation "com.github.kittinunf.fuel:fuel-android:$fuel_version"    implementation "com.github.kittinunf.fuel:fuel-livedata:$fuel_version"    implementation "com.github.kittinunf.fuel:fuel-gson:$fuel_version"

初始化,添加拦截器

import com.github.kittinunf.fuel.core.FuelManagerimport com.github.kittinunf.fuel.core.Methodimport com.github.kittinunf.fuel.core.Requestimport com.sg.dpraise.BuildConfigimport com.sg.dpraise.common.utils.log/** * Author:xqt * Date: 2018/12/21 * Description:初始化fuel网络请求 */object FuelTestHelper{    fun initFuel(){        //val requestInterceptors: MutableList<((Request)-> Request)-> ((Request)->Request)> = mutableListOf()        //服务器接口地址        FuelManager.instance.basePath = "http://www.xxxxxx.com"        //超时时间20秒        FuelManager.instance.timeoutInMillisecond = 20000        //FuelManager.instance.baseHeaders = mapOf("token" to "BearerAbCdEf123456")        //添加header拦截器        FuelManager.instance.addRequestInterceptor(tokenInterceptor())        //添加请求日志拦截器        FuelManager.instance.addRequestInterceptor(cUrlLoggingRequestInterceptor())        //foldRight 是 List 的一个扩展函数 从右往左,对列表中的每一个元素执行 operation 操作,        // 每个操作的结果是下一次操作的入参,第一次 operation 的初始值是 initial。        //requestInterceptors.foldRight({r: Request -> r}){f,acc-> f(acc)}    }    /**    * @Author :xqt    * @Description :日志拦截器    * @Return :    * @Params :    */    private fun cUrlLoggingRequestInterceptor() ={        next: (Request) -> Request ->{            r: Request ->                    var logging = StringBuffer()                    logging.append("\n-----Method = ${r.method}")                    logging.append("\n-----mediaTypes = ${r.mediaTypes}")                    logging.append("\n-----headers = ${r.headers}")                    logging.append("\n-----url---->${r.url}")                    when(r.method){                        Method.POST->{                            logging.append("\n-----request parameters:")                            r.parameters.forEach {                                logging.append("\n-----${it.first}=${it.second}")                            }                        }                    }                    log(logging)                    next(r)                }            }    /**    * @Author :xqt    * @Description :添加header    * @Return :    * @Params :    */    private fun tokenInterceptor() = {        next: (Request) -> Request ->{            req: Request ->                //"Content-Type:application/x-www-form-urlencoded; charset=UTF-8"                req.header(mapOf("token" to "BearerAbCdEf123456"))//变量替换                next(req)        }    }}

在application中或者主activity中调用FuelTestHelper.initFuel()方法做初始操作

下面定义所有请求的公共方法:(注:demo里面这里有误,无法解析,请按照下面的代码修改)

-----------------以下需求手动修改--------------------------------

fun  Request.request(context: Context,helper: HttpHelper,dialogTip:String? = null){    var dialog = context.createLoadingDialog(dialogTip)    this.rx_responseString()           .subscribeOn(Schedulers.io())           .observeOn(AndroidSchedulers.mainThread())           .subscribe{result->               dialog?.stopLoadingDialog()               val (_, rt) = result               val err = rt.component2()               if (err == null) {//请求成功                   log(rt.component1())                   var resp = Gson().fromJson(rt.component1(), Resp::class.java)                   when(resp?.code){                       0-> {                           var data = Gson().fromJson(resp.data, helper.rawType)                           helper.onReqFinish(data, 0)                       }                       else-> {                           toast(resp.msg)                           helper.onReqFinish(null, -1)                       }                   }               } else {//请求失败                   helper.onReqFinish(null,-1)                   log(err.toString())                   var msg = Error.REQUEST_ERROR                   when(err.exception){                       is JsonSyntaxException -> msg = Error.PARSER_ERROR                       is ConnectException -> msg = Error.NET_ERROR                       is SocketTimeoutException -> msg = Error.NET_TIMEOUT_ERROR                       is HttpException -> msg = Error.SERVER_ERROR                       is UnknownHostException -> msg = Error.NET_ERROR                   }                   toast(msg)               }           }}/*** @Author :xqt* @Description :创建对话框* @Return :* @Params :*/fun Context.createLoadingDialog(msg:String? = null):LoadingDialog? {    var loadingDialog = LoadingDialog(this, R.style.loadingdialog)//创建Dialog并设置样式主题    loadingDialog?.setCancelable(false)    loadingDialog?.show()    if (msg != null){        loadingDialog?.setLoadMsg(msg)    }    return loadingDialog}/*** @Author :xqt* @Description :关闭* @Return :* @Params :*/fun LoadingDialog?.stopLoadingDialog() {    if (this!=null && this?.isShowing){        this?.dismiss()    }}

HttpHelper方便回调可自行定义:

/** * 请求回调 */abstract class HttpHelper {    abstract fun onReqFinish(data: T?, code: Int)    /**    * @Author :xqt    * @Description :延迟初始化    */    val rawType: Type by lazy {        getSuperclassTypeParameter(javaClass)    }    companion object {        fun getSuperclassTypeParameter(cls:Class<*>): Type {            val superclass = cls.genericSuperclass            if (superclass is Class<*>) {                throw RuntimeException("Missing type parameter.")            }            val parameterized = superclass as ParameterizedType            return `$Gson$Types`.canonicalize(parameterized.actualTypeArguments[0])        }    }}
Resp数据解析类:
/** * 基础返回数据结构 */data class Resp (        var code:Int = -10000,        var data: T? = null,        var msg: String? = null)

-----------------以上需求手动修改--------------------------------

实际调用:

import android.view.Viewimport com.github.kittinunf.fuel.httpGetimport com.sg.dpraise.Rimport com.sg.dpraise.bean.frame.UserModelimport com.sg.dpraise.common.utils.isMyEmptyimport com.sg.dpraise.common.utils.setStatusColorimport com.sg.dpraise.common.utils.toastimport com.sg.dpraise.frame.base.BaseFragmentActivityimport com.sg.dpraise.http.ApiConstantimport com.sg.dpraise.http.HttpHelperimport com.sg.dpraise.http.requestimport kotlinx.android.synthetic.main.activity_login_layout.*import org.jetbrains.anko.startActivity/** * Author:xqt * Date: 2018/12/27 * Description: */class LoginActivity : BaseFragmentActivity() {    override fun getLayoutResId() = R.layout.activity_login_layout    /**    * @Description :初始化操作    */    override fun initView() {    }    /**    * @Description :initView调用完成后调用 做数据初始操作    */    override fun initData() {    }    fun onClick(v: View){        when(v.id){            R.id.R_tvLogin -> login()            R.id.R_tvForgotPwd -> forgotPwd()            R.id.R_tvRegister -> register()        }    }    /**    * @Description :注册    */    private fun register() {        startActivity()    }    /**     * @Description :忘记密码     */    private fun forgotPwd() {        startActivity()    }    /**     * @Description :登录     */    private fun login() {        var phone = R_editPhone.text.toString()        var pwd = R_editPwd.text.toString()        when {            phone.isMyEmpty() -> {                toast("手机号不能为空")                return            }            pwd.isMyEmpty() -> {                toast("密码不能为空")                return            }            pwd.length < 6 -> {                toast("密码不能小于6位")                return            }            else -> {                //登录                ApiConstant.LOGIN_API.httpGet(listOf("phone" to phone,"password" to pwd))                        .request(this,object: HttpHelper {                            override fun onReqFinish(data: UserModel?, code: Int) {                                //处理结果                                if (code == 0){                                    //登录成功                                }                            }                        })//                ApiConstant.LOGIN_API.httpPost(listOf("phone" to phone,"password" to pwd))//                        .request(this,object: HttpHelper> {//                            override fun onReqFinish(data: List?, code: Int) {//                                //处理结果//                                if (code == 0){//                                    //登录成功//                                }//                            }//                        })            }        }    }}

这里使用接口地址直接调用的方式(ApiConstant.LOGIN_API)

object ApiConstant {   const val LOGIN_API = "/api/shop/login"   const val FORGOT_PWD_API = "/api/shop/forgetPwd"}

 

demo下载

 

更多相关文章

  1. media server分析
  2. Android的init过程:初始化语言(init.rc)解析
  3. RxJava + Retrofit 的实际应用场景
  4. Android(安卓)Camera2.0 结合ImageReader拍照并解决图片偏转问题
  5. Qt For Android(安卓)数据库操作
  6. android java file 清理垃圾获取文件大小 删除文件等操作
  7. Android(安卓)本地文件、文件夹操作
  8. android 4.3 操作源码实现系统截屏(暂无移植性)
  9. Android(安卓)ADB命令大全(通过ADB命令查看wifi密码、MAC地址、

随机推荐

  1. Android(安卓)SmartRefreshLayout下拉刷
  2. 如何让android不运行默认的MainActivity.
  3. Android使用代码实现关机/重启
  4. android studio里面的svn基本使用
  5. Error generating final archive: Debug
  6. Android的富文本功能
  7. Android(安卓)Studio中集成OpenCV——只
  8. HorizontalScrollView
  9. 转:Bitmap造成OOM的讨论与解决方案
  10. Base64编解码Android和ios的例子,补充JNI