最近杭州的天气糟透了,这两天贼冷,看天气预报过几天温度又会上升到20+摄氏度,那我们就写个用kotlin和jetpack写个天气app玩玩好好了。话不多说,go!奥力给。
1.网络请求部分
既然用kotlin,我们就用协程+retrofit搭配viewModel,使用起来真的很简单,给人一种舒服了的感脚。这里我用的是彩云天气api的接口,想用的小伙伴可以自己去申请,免费版每日有请求次数上限。
没错和retrofit原来的使用方法一模一样,想要在协程中使用,我们只要添加一个suspend关键字就好了(比较简单,原谅我直接截图)。suspend翻译为"挂起",引用一张图:
suspend函数必须在协程中调用,我们可以把网络请求函数申明为suspend,当运行到我们的suspend的函数的时候,会把当前程序”挂起“(图中很容易看出用一个栈保存了挂起的时候我们程序运行到哪了),然后去执行我们的suspend函数(比如在子线程中执行网络请求),等我们的网络请求返回数据的时候再从刚才程序"挂起"的地方继续执行。
ok,理论知识差不多了,快来看下怎么在ViewModel中发起网络请求吧:
但是根据官方推荐的做法,我们是不应该把获取数据的任务交给ViewModel,所以我们先创建一个Repository,它的唯一任务就是获取数据。
看里面有一个 getHangzhouWeather()方法用来获取网络数据。还有一个kotlin版本的单例写法,还有就是一个service变量由retrofit创建。等不及了我们赶紧发起一个网络请求,我们子在viewModel里面写一个方法:
这个fetchWeather()方法在viewModelScope里面调用了repository的获取数据的方法。
使用viewModelScope,当viewModel被销毁的时候,我们的网络请求会自动取消,这也是忧点。香!
2.数据驱动的思想
有没有注意到上述网络请求的数据都被加载到了_hangZhouRealtime这个变量里面了!所以我们只要让fragment去观察他,然后根据不同的数据去绘制不同的UI就可以了,这就是LiveData的作用。
简单来说,viewModel.hangZhouRealtime.observe()方法,可以让我们的ui根据viewmodel数据做出相应的变化。当然还有其他的优点,他们都是生命周期"敏感"的。
3.依赖注入
当然,我们使用依赖注入肯定会是加分项的,这里我没用dagger,koin这些,我手动依赖注入了,因为依赖注入的地方不多哈哈。
4.总结
标题是抄作业,对于项目中很多地方的处理都参考了其他项目,比如google的sunflower项目,google的iosched项目。我很赞同我之前看到的一句话,你现在写的代码都是你以前从哪里看见过的,我表示十分赞同哈哈,所以上面很多东西其实都是我抄的。大家疫情期间做好防护哈,学技术的同时也要注意身体健康啊。