mvvm的网络框架的搭建
之前,我们简单的介绍了一下MVVM的框架的构成以及搭建的基本的demo 但是网络请求是我们日常开发当中,非常基本也是必须的一部分,下面 我们一起来梳理一下带有网络请求的MVVM。
首先我们先在项目里集成相关的依赖
/** * config.gradle用于配置项目中各种lib引用和版本号控制 * * [module_*] 各module版本号及applicationId控制 * 如需在各个module中升级更新版本号,请使用 module_[modulename]*的命名规则 * * [project.ext.dependVersion] 中创建各个依赖库的版本号控制,需在类库名称后增加‘_version’ * * [类库maven地址] 中创建各个类库的maven地址,同一类库需要引用多个类时,可以使用数组,要确保类库引用不重复 * * [项目依赖列表] 中创建可以直接让module引用的依赖列表,以Deps结尾,原则上以类库功能分类,比如网络库,图片处理库 * 尽量不要以类库本身的名字命名依赖列表 * * 各个module中引用类库时尽量使用项目依赖列表中的项目,不要直接使用类库地址中的项目 * * 需要添加新的类库时,先查询本列表和项目中是否已引用类似功能的类库,尽量不要添加重复功能的类库 */project.ext { compileSdkVersion = 27 buildToolsVersion = '27.0.3' minSdkVersion = 16 targetSdkVersion = 27 //主app module_appApplicationId = 'yang.cehome.com.mvvmdemo' module_appVersionCode = 0001 module_appVersionName = '1.0.0' module_appName = 'MVVM' //引用类库的版本号 dependVersion = [ kotlin_version : '1.2.51', support_version : '27.1.1', databinding_version: '3.2.0-alpha10', retrofit2_version : '2.3.0', gson_version : '2.8.5', rxandroid_version : '2.1.0', rxjava_version : '2.2.2' ] //*************************类库maven地址************************** kotlin_base = [kotlin_stdlib_jdk8: "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$dependVersion.kotlin_version" ] supportLibs = [ design : "com.android.support:design:$dependVersion.support_version", appcompat_v7: "com.android.support:appcompat-v7:$dependVersion.support_version", constraint : 'com.android.support.constraint:constraint-layout:1.1.3'] databindingLibs = [databinding: "com.android.databinding:compiler:$dependVersion.databinding_version"] network = [ retrofit : "com.squareup.retrofit2:retrofit:$dependVersion.retrofit2_version", retrofit_converters: "com.squareup.retrofit2:converter-gson:$dependVersion.retrofit2_version", retrofit_adapters : "com.squareup.retrofit2:adapter-rxjava2:$dependVersion.retrofit2_version"] gson = [gson: "com.google.code.gson:gson:$dependVersion.gson_version"] rxandroid = [rxandroid: "io.reactivex.rxjava2:rxandroid:$dependVersion.rxandroid_version"] rxjava = [rxjava: "io.reactivex.rxjava2:rxjava:$dependVersion.rxjava_version"] //********************项目依赖列表********************** kotlinDeps = [kotlin_base.values()] supportDeps = [supportLibs.values()] databindingDeps = [databindingLibs.values()] networkDeps = [network.values(), gson.values()] rxDeps = [rxandroid.values(), rxjava.values()]}复制代码
依赖的方式我们依旧采取这种统一管理的方式。 然后 我们在工程依赖
dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation project.ext.kotlinDeps implementation project.ext.supportDeps implementation project.ext.networkDeps implementation project.ext.rxDeps annotationProcessor project.ext.databindingDeps}复制代码
代码实现
我们增加了一个remote的包 同时 增加了一个Service类 包的结构如图
这个接口我们就从网上找了一个关于手机号的省份的api (想和Gsonfromat一样把Json快速生成Kotlin的代码,推荐一个插件JsonToKotlinClass)这样就可以快速根据Json生成Kotlin的类,使用比较简单和GsonFromat一样的。 如图 迅速生成了对应的实体。data class WeatherInfoData( val weatherinfo: Weatherinfo)data class Weatherinfo( val AP: String, val Radar: String, val SD: String, val WD: String, val WS: String, val WSE: String, val city: String, val cityid: String, val isRadar: String, val njd: String, val sm: String, val temp: String, val time: String)复制代码
现在开始写请求
package yang.cehome.com.mvvmdemo.model.remoteimport io.reactivex.Singleimport retrofit2.http.GETimport yang.cehome.com.mvvmdemo.model.data.WeatherInfoData/** * @author yangzc * @data 2018/9/11 18:13 * @desc WeatherService * */interface WeatherService { //获取天气 @GET("/data/sk/101190408.html") fun getWeatherInfo(): Single}复制代码
下面我们开始写ViewModel
package yang.cehome.com.mvvmdemo.viewmodelimport android.databinding.ObservableFieldimport io.reactivex.android.schedulers.AndroidSchedulersimport io.reactivex.schedulers.Schedulersimport yang.cehome.com.mvvmdemo.model.data.WeatherInfoDataimport yang.cehome.com.mvvmdemo.model.remote.WeatherService/** * @author yangzc * @data 2018/9/12 14:20 * @desc WeatherViewModel * */class WeatherViewModel(val remote: WeatherService) { /******data******/ val weatherinfo = ObservableField() /******binding******/ fun loadWeather() { remote.getWeatherInfo() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ t: WeatherInfoData? -> weatherinfo.set(t?.let { it.weatherinfo.toString() }) }, { t: Throwable? -> weatherinfo.set(t?.message ?: "error") }) }}复制代码
接下来 我们一起看一下Activity当中的代码
package yang.cehome.com.mvvmdemo.viewimport android.databinding.DataBindingUtilimport android.os.Bundleimport android.support.v7.app.AppCompatActivityimport retrofit2.Retrofitimport retrofit2.adapter.rxjava2.RxJava2CallAdapterFactoryimport retrofit2.converter.gson.GsonConverterFactoryimport yang.cehome.com.mvvmdemo.Rimport yang.cehome.com.mvvmdemo.databinding.ActivityMainBindingimport yang.cehome.com.mvvmdemo.model.data.Onclickimport yang.cehome.com.mvvmdemo.model.remote.WeatherServiceimport yang.cehome.com.mvvmdemo.viewmodel.OnclikViewModelimport yang.cehome.com.mvvmdemo.viewmodel.WeatherViewModel/** * MVVM 当中的一个V层 将三者联系起来 */class MainActivity : AppCompatActivity() { private lateinit var mBinding: ActivityMainBinding private lateinit var mViewMode: OnclikViewModel private lateinit var mViewMode2: WeatherViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main) /model val onclick = Onclick("me", 0) ///ViewModel mViewMode = OnclikViewModel(onclick) ///binding val remote = Retrofit.Builder() .baseUrl("http://www.weather.com.cn") .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build().create(WeatherService::class.java) mViewMode2 = WeatherViewModel(remote) mBinding.vm = mViewMode mBinding.remote = mViewMode2 }}复制代码
我们可以看到 在Activity当中承担了请求网络的角色 但是 对于数据的处理并没有在这里体现,同时 我们可以看到对于点击的操作以及显示并没有出现在这里。 接下来我再看一下布局文件,大家可以看到新的结构对于布局文件的重要性
复制代码
当然在最后别忘了加上网络权限
复制代码
接下来我们就可以看到效果了
至此完成了MVVM框架的搭建,也完成了基本的网络请求,对于MVVM框架有了一个更加深刻的了解,那么接下来要进一步优化一下框架,丰富的功能。