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

本文共 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

你可能感兴趣的文章
水木-搜索引擎技术版
查看>>
yiStack平台维护
查看>>
oracle11g程序调优纪实
查看>>
webview页面和壳通信的库(精简版)
查看>>
手把手教你如何加入到github的开源世界! (转)
查看>>
NFS 配置服务
查看>>
iOS Swift编程语言
查看>>
Android 实现闹钟功能
查看>>
graal
查看>>
Win10 安装msi 提示2502、2503的错误代码 -- 命令提示符(管理员) -- msiexec /package...
查看>>
组策略脚本的趣味应用
查看>>
corosync+pacemaker高可用集群
查看>>
景安河南机房电力事故,部分主机和云服务器停机
查看>>
1024x600 7" LVDS LCD with Capacitive Touch for pcD
查看>>
解决ubuntu系统安装完后启动项里没有ubuntu的问题
查看>>
Objective-C中new与alloc/init的区别
查看>>
手动编译Mysql5.6.10 手动编译php 支持fastcgi
查看>>
MySQL主主
查看>>
linux的权限管理以及特殊权限SUID,SGID,Sticky
查看>>
大数据测试之初识Hadoop2
查看>>