zoukankan      html  css  js  c++  java
  • kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式

    今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小案例,希望对大家有所帮助,效果图:

              

     
    Retrofit是Square公司开发的一款针对Android网络请求的一个当前很流行的网络请求库。可参考博客看详细介绍:Android开发之Retrofit+RxJava的使用

    完成以上功能需引入:

        compile "com.android.support:appcompat-v7:$support_version"
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        compile "org.jetbrains.anko:anko-common:$anko_version"
        compile 'com.zhy:okhttputils:2.6.2'
        compile 'com.alibaba:fastjson:1.1.54.android'
        compile 'com.squareup.retrofit2:retrofit:2.1.0'
        compile 'com.squareup.retrofit2:converter-gson:2.1.0'
        compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
        compile 'io.reactivex:rxandroid:1.2.1'
        compile 'io.reactivex:rxjava:1.1.6'

    先来看看 Activity

    MvpOkHttpActivity.Java

    class MvpOkHttpActivity : BaseActivity<IView,PresenterEmlpe>(),IView {
    
        override fun setMainLayout(): Int {
            return R.layout.activity_mvp_ok_http
        }
    
        override fun createPresenter(): PresenterEmlpe {
            return PresenterEmlpe()
        }
    
        override fun initView() {
            text.text="加载中......"
        }
    
        override fun initBeforeData() {
          btn.setOnClickListener {
              p!!.onRequest(Api.showRequestData("15","5"))
          }
        }
    
        override fun onLoadContributorStart() {
            toast("加载中......")
        }
    
        override fun onLoadContributorComplete(data: String) {
            Log.i("data",data)
            toast(data)
            //解析数据
            val entityTitle = JSON.parseObject(data, EntityTitle::class.java)
            if (entityTitle.data != null){
                text.text=entityTitle!!.data!!.get(0).title
            }
    
        }
    
        override fun onNetWrok() {
            toast("网络未连接")
        }
    
        override fun onError(error: String) {
            toast(error)
        }
    
    }

    可见代码是相当比较少的,以MVP模式来完成的,主要有Model,Presenter,View

    Model:

    class ModelEmlpe : IMode{
    
        override fun onRequest(url: String, map: Map<String, String>,callBackListenter: IMode.CallBackListenter) {
    
            OkHttpUtils.post().url(url).params(map).build().execute(object : StringCallback() {
                override fun onError(call: okhttp3.Call, e: Exception, id: Int) {
                    callBackListenter.onError("加载数据失败")
                }
    
                override fun onResponse(response: String, id: Int) {
                    callBackListenter.onDataCallBackListenter(response)
                }
            })
        }
    }

    Presenter

    class PresenterEmlpe : BasePresenter<IView>(){
    
        var model: IMode? = null
        init {
            model = ModelEmlpe()
        }
        fun onRequest(map: Map<String,String>){
            var iView = getView()
            if (model != null && iView != null) {
    
                //验证网络  无网络不加载
                if (false){
                    iView.onNetWrok()
                    return
                }
                iView.onLoadContributorStart()//初始化
                model!!.onRequest(Api.url, map, object : IMode.CallBackListenter {
    
                    override fun onDataCallBackListenter(data: String) {
                       iView.onLoadContributorComplete(data)
    
                    }
                    override fun onError(error: String) {
                        iView.onError(error)
                    }
    
                })
            }
    
        }
    
        override fun detachView() {
            super.detachView()
            if (model != null){
                model = null
            }
        }
    
    
    }

    当然解析数据也可以不用在Activity中完成,可以在我们的Presenter或Model中完成也是可以的,

    我们的RxJava+Retrofit 提供了请求时就直接解析的功能,这点也可以好好运用。

    两种请求方式的Activity,Presenter和View 其实是差不多的,就是Model层 实现的方式不一样而已。

    由于代码太多,就不一一贴出来了,源码直接下载即可

     源码点击下载

  • 相关阅读:
    java 调用可执行文件时,ProcessBuilder异常CreateProcess error=2
    easyUI行内编辑与jdbc批量更新
    Oracle中merge into应用举例
    mybatis插入List<Map<String, String>>批量数据到Oracle数据库
    插入数据库值大于数据库字段设置的长度导致的mapper执行中断,控制台未报错
    ORA-25156:旧样式的外部联接(+)不能与 ANSI链接一起使用
    Oracle列转行函数listagg使用演示
    Oracle查询序列和函数方法封装
    js取url问号后的参数方法封装
    linux查看文件具体时间和大小
  • 原文地址:https://www.cnblogs.com/zhangqie/p/7454260.html
Copyright © 2011-2022 走看看