生活资讯
rxbus 、RX部是什么意思
2023-04-07 01:47  浏览:36

android项目多个返回按钮点击事件怎样用一个方法解决

返回上一个activity只需要调用 finish() 方法(前提是你跳转的时候没有关闭上个activity)

当然,这也必须要通过点击事件来实现

1.写个baseActivity实现 OnClickListener

public abstract class baseActivity extends AppCompatActivity implements OnClickListener{}

这样每个继承它的activity都会自动重写

@Override

public void onClick(View view) {

switch(view.getid){

    }

}

给每一个需要点击事件的view 写个监听 view.setonClickListener(this);

2.使用框架 比如xUtil等 不推荐

3.使用butterknife

4.使用rxjava实现的rxbus

5.使用EventBus 不推荐

Flutter 与 Android 互调

在做这个小 demo 的时候,遇到了一些坑,到文章发布 坑 还是没有填好,无奈,只得用了别的方式实现了本篇文章的功能。

我这个人的缺点就是 爱钻牛角尖,哎

废话不多说,看效果图

那么,我们开始吧!

我们先看界面逻辑,先不考虑功能,然后将此布局给予上层

注意看这一行

这行其实作用就是声明了 链接 Android 原生的 MethodChannel

当然了,里面的内容随意, 你看我写的多随意

而真正的调用逻辑是

对 就是 invokeMethod 这个方法

当然这个方法的使用还有「带参数的使用方法」

再来看下方法的实现

ok,到此,Flutter 的逻辑就基本走完了,现在来看下 Android 的逻辑

这里,是我浪费了点时间的一个坑,我以为我可以直接在 Flutter 的项目结构下去更改 Android 的项目,结果证明我还是 too young 了,好了,说下我的方法,我是直接切换到了 Android 的项目结构,如下图

这样就可以进入 Android 的结构了

很简单,你想实现相互调用,那么肯定得有 暗号 吧

这里是通过

来实现的

其中 MethodCall 能够判断 Flutter 传递过来什么名称的参数,得到参数的内容等

而 MethodChannel.Result 则能够返回结果给 Flutter

上面的截图就是通过这两个类来实现的逻辑

定义依赖

定义 Bean

定义网络接口

实现 RetrofitHelper

通过 jakewharton 封装的 rxrel*** 结合 rxjava2 实现 rxbus

Android Flutter 互调

MethodChannel 在 Flutter 及 Android 中的使用

Flutter 页面跳转

RxBus 封装

Bingo

谢谢小伙伴的关注、收藏、点赞,谢谢~~

安卓开发有哪些好用的框架

1、网络请求:OkHttp、Retrofit、Xutils、Volley...

2、注解:ButterKnife、AndroidAnnoation、Xutils

3、图片加载:Glide、ImageLoader、Picasso、Fresco

4、Rx系列:RxJava、RxAndroid、RxBus、RxPermission、RxLifecycle

其他的在Github有很多,可以根据自己的需求和能力进行学习和使用。

为什么避免使用EventBus/RxBus

EventBus和Otto在之前作为Android组件间通信工具,简单方便十分受欢迎,但是也非常容易Abuse。大概有如下几个缺点:

由于是Event,在发布Event的时候就要做好准备可能并没有人接受这个Event, Subscribe的时候也要做好准备可能永远不会收到Event。Event无论顺序还是时间上都某种程度上不太可控。如果你将数据寄托在Event上然后就直接在Android其他生命周期方法中直接使用这个数据或成员变量。那么很有可能你会得到NPE。

EventBus看似将你的程序解耦,但是又有些过了。我们常常使用EventBus传数据,这已经是Dependency级别的数据而不是一个可以被解耦出来的模块。这样就造成了过多EventBus的代码会造成代码结构混乱,难以测试和追踪,违背了解耦的初衷。这时如果有意或无意的造成了Nested Event。那情况会更糟。

由于EventBus的种种缺点,以及后面RxJava的出现。很多人都开始使用RxJava来取代EventBus。甚至Otto的官方介绍里都写到:

Deprecated!

This project is deprecated in favor of RxJava and

RxAndroid. These projects permit the same event-driven

programming model as Otto, but they’re more capable and offer better control of threading.

If you’re looking for guidance on migrating from Otto to Rx, this post

is a good start.

链接是一个教你怎么使用RxJava来自己手动写一个RxBus来代替EventBus的文章。虽然看起来是在用RxJava。但是实际上却仍然在用EventBus。甚至这个封装其实也并没有GreenRobot或者Otto来的好。

我们看看Jake Wharton对RxBus的评价:

我想"RxBus"唯一的好处就是他是一个Rx的入门毒品。否则的话,你要么就不是在用Rx,要么你需要更加惯用的Rx资源 (渣翻译见谅)

再来一个GitHub的:

subscribeActual部分我们先不考虑。然而Jake指出***不要使用Rel***来“重新发明”Event Bus.

这里看图说话:

Jake Wharton在GOTO 2016 上的讲座中提到,我们正常的Android编程是这样的:

我们像一个中间人一样。

而使用RxJava。 我们的结构,更像这样

我们使用RxJava来直接把组件相连,对所接受到的数据作出反应,所谓的 "Reactive"。

而使用Eventbus? Jake 没说, 我自己画一个:

我们作为一个中间人,传递消息。EventBus作为另一个中间人。帮我们传递消息。(这也就是所谓的“看似解耦”)

再打个比方,虽然我们将EventBus翻译成时间总线,但是其实总线就是Bus也就是公交车。而RxJava更像一个专车,Uber或者滴滴。他直接链接你的两个或多个需要通信的类。传输数据,当然你可以做一个很大的专车,穿梭在所有类之间,也就是所谓的RxBus。所以在这里为什么放弃RxBus也就不言而喻了不是?

那么,问题来了?

怎样才是正确(正常?)的RxJava使用方式?

其实Jake 也在GitHub的讨论上给出了一个答案:

所以应该是,每当你想发布一个Event在EventBus时,直接暴露一个Observable出来。每当你想接受一个Event时,找到这个Observable并且Subscribe他。

这样做的好处是什么?

目标和地点都很明确。你的Subscriber明确的知道他Subscribe的是谁,而且明确的知道我需要作出什么反应。这也正是RxJava的核心“响应式编程”。

由于使用了Observable,对于异常处理将会非常方便。而且还有功能强大全面的Operator来辅助你。

虽然看起来耦合性有所增加。但是这是必要的,上面也说过,EventBus虽然在代码上看似解耦。其实他们还是联系在一起的。而我们这样直接暴露Observable给需要的其他类,这完成了1 - 1/N的链接,而不需要EventBus这个中间人来传递消息/事件,而且保证我们需要的事件一定会直接到达。

我们来举个例子

上下两个Fragment,上面的一个EditText,下面的一个TextView。上面的EditText变化的时候下面的TextView也跟着变化。

先把EditText的TextChangedListener封装在Observable里:

       stringObservable = Observable.create(e - editText.addTextChangedListener(new TextWatcher() {

           @Override

           public void beforeTextChanged(CharSequence s, int start, int count, int after) {

           }

           @Override

           public void onTextChanged(CharSequence s, int start, int before, int count) {

               e.onNext(s.toString());

           }

           @Override

           public void afterTextChanged(Editable s) {

           }

       }));

   //Expose Observable

   public ObservableString getEditTextObservable() {

       return stringObservable;

   }

不习惯自己封装可以使用RxBinding :

       stringObservable = RxTextView.textChangeEvents(editText)

                                    .map(event - event.text().toString());

再从我们的TextViewFragment中 取到这个封装好的Observable:

   @Override

   public void onStart() {

       super.onStart();

       FragmentEditText fragment = (FragmentEditText) getFragmentManager().findFragmentByTag(FragmentEditText.TAG);

       if(fragment != null){

           fragment.getStringObservable().subscribe(s - textView.setText(s));

       }

   }

来看看效果:

当然,这里还有个问题

由于我们将editText封装在Observable里,无论是create()方法还是使用RxBinding,都会持有这个View的强引用。造成内存泄漏。所以我们一定要在最后加入dispose()方法来释放。所以我推荐使用RxBinding,他已经帮我们在dispose()方法里写好了解除Listener的方法。

因为并没有使用publish操作符,导致多个Subscriber的时候还是有些许问题。可以考虑直接加入.share().

一款基于MVVM的魔方计时器,喜欢魔方的朋友千万不要错过

还有更多功能等待各位魔友去开发哦

也就是消息共享,这个应该是项目中耗时最长的部分,因为我设计了两个页面要求实现数据共同更新,计时页面 的数据回传,打乱公式的单一性等等,我一共使用了三种实现,而且因为是Mvvm架构所以所有消息传递的逻辑都写在viewmodel中。 RxBus,是我最喜欢用的也是用的最多的,利用了Rxjava来实现观察和订阅的功能,对于比如主页面讲打乱公式传到计时器页面是用了粘性事件传输,相当于是先传输后接收,Rxbus比较简单,此处我直接使用了框架中封装好的Rxbus。 Messenge,一款轻量级全局的消息通信工具,主要是完成一些简单的页面通信功能,写起来比Rxbus简单而且相对方便易读。 全局的shareViewModel,在callback中写一个shareViewModel并封装为单例,让其只有一个实例因此可以在需要通信的ViewModel都得到它的引用,在需要观察的页面对其进行观察,通过改变LiveData来完成通信的需求。我其实开始是很想利用Livedata进行页面通信操作,因此写出来这个shareViewModel,感觉写的并不好,后来想一想应该可以借鉴github上的LiveEventBus的思想来做一个类似RxBus的封装,但是感觉用起来还是没有Rxbus方便和易读,因此浅尝辄止。

从主页面和计时器页面侧滑可以实现页面的切换,使用了Blankj的SwipePanel,使用比较简单,可以自己设置触发位置,出发效果以及监听侧滑的事件,源码只有六百多行,非常具有参考价值。

因为android并没有原生的毫秒计时器,所以我基于handler实现了一个毫秒级的计时器,具体可以看util包中的mychorometer。

项目请移步这里

关于rxbus和RX部是什么意思的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

发表评论
0评