但为什么今天又用Kotlin了呢?
其实,做程序开发是一个不断学习的过程,一天不去接触学习新东西,你就会落后甚至过时,所以说当出现新玩意的时候,你可以不用,但不能不会,只有这样,你才能在职业生涯中游刃有余,就像今天说的这个MVVM框架,以及ViewBinding,我相信很多开发者刚把mvp模式玩6,RxJava,Retrofit弄懂,甚至于有些还在用mvc模式,你就告诉我他们统统过时了???我尼玛,这要累死人的节奏???没办法,程序界发展就是这么快,稍不留神你就已经落伍了,这也是为什么程序员吃青春饭这一说法的由来了,你跟不上节奏,甚至于连去跟节奏的心也没有了,那就只能被淘汰了!
闲话说了这么多,进入正题吧!如果你问我,目前最流行的移动端开发模式是什么,我会毫不犹豫的告诉你:MVP+Rxjava+Retrofit+EventBus…,MVP优点自不必说,但缺点相信现在还在用MVP模式的你会深有体会,可以说成也P,败也P,随着项目的扩大,界面的增多,接口的增多,P会越来越多,P中的回调也会越来愈多,在某个界面想重用某个接口时,如果不想进入回调地狱,就只能再写一个新的P,相当麻烦。还有一个缺点就是,在使用p的时候,总是要实现回调接口,再声明p,然后attach,界面销毁时再调用detach,否则就可能会内存泄漏,这两点是不是不能忍?所以MVVM就出现了,对于MVVM,你可以这么理解,M+V+VM,就是把MVP的Presenter换成ViewModel,VM不但可以替代Presenter的功能,还能解决Presenter的两个缺点,上面说过,本篇不作原理性分析,因为这类文章太多了,再分析分析也是多次一举,所以就直接上代码:
ViewModel的简单用法:
在mvp模式下,当我们有服务器交互也就是需要调用接口时,我们便会为此界面创建一个Presenter,同样的,mvvm模式下,我们要为这个界面创建一个ViewModel,例如我们为MainActivity创建MainViewModel :
class MainViewModel : ViewModel() {
}
需要继承ViewModel,并且ViewModel中一般会配合LiveData使用:
class MainViewModel : ViewModel() {
var data = MutableLiveData()
fun getData() {
//模拟数据请求
var result = “请求结果”
data.value = result
}
}
在MainActivity中声明,并使用MainViewModel :
mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)
mainViewModel.getData()//调用方法,模拟请求数据
mainViewModel.data.observe(this, Observer {//观察data变化,相当于接口请求回调函数
textView.text=it
})
LiveData的observe,就是一个观察者,发现数据有变化时就会立马通知你,参数it就是MainViewModel 中 MutableLiveData(),<>中声明的数据类型的数据,我们不要像presenter一样 需要attach和detach,也不需要些回调接口,只用观察,就这么简单!
再来看ViewBinding:
文档连接:https://developer.android.google.cn/topic/libraries/view-binding
ViewBinding和DataBinding的区别:
ViewBinding和DataBinding均会生成可用于直接引用视图的绑定类。不过,这两者之间存在明显差异:
1.DataBinding仅处理使用 代码创建的数据绑定布局。
2.ViewBinding不支持布局变量或布局表达式,因此它不能用于在 XML 中将布局与数据绑定。
ViewBinding仅是节省了findview的步骤,并且启用后,每当创建一个xml布局文件,便会自动生成一个对应的ViewBinding类,仅需在界面里的setContentView传入ViewBinding.根视图root即可使用,使用方法为ViewBinding对象.id
private lateinit var binding: ActivityMainBinding
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.mRecyclerView.layoutManager = LinearLayoutManager(this)
binding.mRecyclerView.adapter = articleAdapter
使用起来也是相当简单,另外项目中封装了相对简单网络请求,
class HttpUtil {
/**
- 通用网络请求方法
*/
inline fun getData(api: String, onResultListener: OnResultListener) {
GlobalScope.launch(Dispatchers.Main) {
withContext(Dispatchers.IO) {
val data = URL(Const.BASE_URL + api).readText()
val result = Gson().fromJson(data, T::class.java)
withContext(Dispatchers.Main) {
写在最后
本次我的分享也接近尾声了,感谢你们在百忙中花上一下午来这里聆听我的宣讲,希望在接下来的日子,我们共同成长,一起进步!!!
最后放上一个大概的Android学习方向及思路(详细的内容太多了~),提供给大家:
对于程序员来说,要学习的知识内容、技术有太多太多,这里就先放上一部分,其他的内容有机会在后面的文章向大家呈现出来,不过我自己所有的学习资料都整理成了一个文档,一直在不断学习,希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!
Android架构师之路很漫长,一起共勉吧!
如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!