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層 實現的方式不一樣而已。

 

由於代碼太多,就不一一貼出來了,源碼直接下載即可

 源碼點擊下載


免責聲明!

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



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