博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVVM框架的搭建(三)——网络请求
阅读量:6747 次
发布时间:2019-06-25

本文共 6878 字,大约阅读时间需要 22 分钟。

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框架有了一个更加深刻的了解,那么接下来要进一步优化一下框架,丰富的功能。

项目地址

转载于:https://juejin.im/post/5bbd9321e51d450e9705223b

你可能感兴趣的文章
Python之路【第十一篇】:三目运算、不同数据类型的存储方式及深浅拷贝(copy模块)、列表推导式...
查看>>
比map更强大的multimap
查看>>
工作流引擎Oozie(一):workflow
查看>>
repo sync下载脚本
查看>>
spfa(前向星)
查看>>
第一个js程序
查看>>
命令纠正工具 thefuck 的简单使用
查看>>
SQL Server附加数据库出现错误5123的正确解决方法
查看>>
插入图片、背景图片
查看>>
c++官方文档-class
查看>>
腾讯2017暑期实习编程题2
查看>>
Android定位&地图&导航——基于百度地图,实现自定义图标绘制并点击时弹出泡泡...
查看>>
FPGA管脚约束
查看>>
软件测试用例
查看>>
python mysql 单表查询 多表查询
查看>>
rsyslog日志服务的配置文件分析
查看>>
android handler概念解释
查看>>
eclipse代码左虚线对齐设置
查看>>
设计模式-命令模式简单理解
查看>>
C中的sizeof
查看>>