今天要說的乾貨是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)網絡請求兩種實現方式的一個小案例,但願對你們有所幫助,效果圖:html
Retrofit是Square公司開發的一款針對Android網絡請求的一個當前很流行的網絡請求庫。可參考博客看詳細介紹:Android開發之Retrofit+RxJava的使用java
完成以上功能需引入:react
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'
先來看看 Activityandroid
MvpOkHttpActivity.Javagit
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,Viewgithub
Model:json
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中完成也是能夠的,app
咱們的RxJava+Retrofit 提供了請求時就直接解析的功能,這點也能夠好好運用。ide
兩種請求方式的Activity,Presenter和View 實際上是差很少的,就是Model層 實現的方式不同而已。
因爲代碼太多,就不一一貼出來了,源碼直接下載便可