赞
踩
在这个kotlin蒸蒸日上的时代,只用java去进行Android开发,显得如此不合时代。
本程序员近日也遇到一些问题,在进行fragment的数据传递时屡屡出错,(怎一个苦字了得)好在最后使用EventBus完美解决,于是决定发布此文,解决同僚相似问题。
EventBus基于观察者模式,将事件的接收者和发送者分开,简化了组件之间的通信操作,使用简单,效率高,体积小。
这里放一张从网友那里借来的图,帮助大家理解(你我之间,怎能以偷字概之?)
1.首先,需要封装注解。
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- public @interface Event {
- String value();
- }
- val bus by lazy {
- MutableLiveData<Pair<String,Any?>>()
- }
2.然后,在需要接收事件实例化他(这里推荐用在封装框架上,实现实例一次,无限复用),用注解去注册事件订阅方法。
- private fun observable() {
- val methods = javaClass.declaredMethods
- for (method in methods){
- val event = method.getAnnotation(Event::class.java)
- if(event != null){
- bus.observe(this){
- if(it.first == event.value){
- method.invoke(this,it.second)
- }
- }
- }
- }
- }
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(binding.root)
- observable()
- initData()
- initView()
- }
这里是注册以及需要传递的数据,具体就不展示了,大家按需自行处理
bus.postValue("getAdapterSize" to adapter.data.size)
- @Event("getAdapterSize")
- fun getAdapterSize(n: Int) {
- val badge = binding.navView.getOrCreateBadge(R.id.navigation_home)
- badge.number = n
- badge.isVisible = badge.number != 0
- }
3.最后,将处理完成的数据发送出去。
这里自定义注解Event使用的是java代码,基于livedata去实现,使用kotlin会有一些小问题,因为并不要求纯血kotlin,因此就使用了java的自定义注解。方法的实现并不一定,各位同僚不妨想想如何用Rxjava去对他进行二次封装,提高性能
eventbus的使用场景可以实现fragment和activity之间的传值,eventbus可以发送粘性事件(不需要提前注册,后注册也可以接受到消息)。望天下再无越修越多的bug和越加越多的班!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。