android进阶:利用rxjava写一个超简单的bus
来源:互联网 发布:python中字符串的函数 编辑:程序博客网 时间:2024/06/03 17:28
没时间解释了,快上车!
效果:每点击一下分别加一、加二
学习前提:
1、前提下有rxjava的简单知识。
2、了解:disposable(解除订阅)、PublishSubject(订阅时并不立即触发订阅事件)。
PublishSubject不懂可以看看这个文章:http://blog.csdn.net/qq1026291832/article/details/51006746
开车!!!
代码很简单,都没脸传资源了,掌握上面的知识可以马上开车!风格有点像EvenBus
核心类:DMRxBus
class DMRxBus { private ConcurrentHashMap<Class, RxBusData> observableMap = new ConcurrentHashMap<>(); private static volatile DMRxBus instance; private DMRxBus() { } /** * 单例,线程一般安全 * @return DMRxBus */ static DMRxBus getDefault() { if (instance == null) { synchronized (DMRxBus.class) { if (instance == null) { instance = new DMRxBus(); } } } return instance; } /** * 注册 * @param classTag 消息类 * @param consumer 收到数据的回调 */ void register(@NonNull Class classTag,Consumer<Object> consumer) { //需要手动注册 System.out.println("register: "+classTag); if (observableMap.get(classTag) == null) { PublishSubject<Object> publishSubject = PublishSubject.create(); Disposable disposable = publishSubject.subscribe(consumer); observableMap.put(classTag, new RxBusData(publishSubject,disposable)); } } /** * 解除注册 * @param classTag 消息类 */ void unregister(@NonNull Class... classTag) {//解除这个页面所有注册 for (Class mClass:classTag) { System.out.println("unregister: " + mClass); if (observableMap.get(mClass) != null) { observableMap.get(mClass).getDisposable().isDisposed();//解除注册 } observableMap.remove(mClass); } } /** * 发送消息 * @param event 消息类 */ void post(@NonNull Object event) { System.out.println("post: "+event.getClass()); if (observableMap.get(event.getClass()) != null) { PublishSubject<Object> publishSubject = observableMap.get(event.getClass()).getPublishSubject(); if (publishSubject != null) { publishSubject.onNext(event); } } } /** * 清除所有订阅 */ void destroy() { if (observableMap.isEmpty()) { return; } for (RxBusData rxBusData:observableMap.values()){ rxBusData.getDisposable().dispose(); } observableMap.clear(); } /** * 订阅的实体 */ private static class RxBusData{ PublishSubject<Object> publishSubject; Disposable disposable; RxBusData(PublishSubject<Object> publishSubject, Disposable disposable) { this.publishSubject = publishSubject; this.disposable = disposable; } PublishSubject<Object> getPublishSubject() { return publishSubject; } Disposable getDisposable() { return disposable; } }}
发送数据类,多少个都没问题:
//类一class MessageEvent1 { private String msg; MessageEvent1(String msg) { this.msg = msg; } String getMsg() { return msg; }}//类二class MessageEvent2 { private String msg; MessageEvent2(String msg) { this.msg = msg; } String getMsg() { return msg; }}
是用MainActivity来测试效果
public class MainActivity extends AppCompatActivity { int count1 = 0; int count2 = 0; TextView msg1Tv; TextView msg2Tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); msg1Tv = (TextView) findViewById(R.id.msg1Tv); msg2Tv = (TextView) findViewById(R.id.msg2Tv); findViewById(R.id.sendBtn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DMRxBus.getDefault().post(new MessageEvent1(String.valueOf(++count1))); DMRxBus.getDefault().post(new MessageEvent2(String.valueOf(count2+=2))); } }); } @Override protected void onStart() { super.onStart(); DMRxBus.getDefault().register(MessageEvent1.class, new Consumer<Object>() { @Override public void accept(@NonNull Object o) throws Exception { MessageEvent1 msg = (MessageEvent1) o; msg1Tv.setText(msg.getMsg()); } }); DMRxBus.getDefault().register(MessageEvent2.class, new Consumer<Object>() { @Override public void accept(@NonNull Object o) throws Exception { MessageEvent2 msg = (MessageEvent2) o; msg2Tv.setText(msg.getMsg()); } }); } @Override protected void onStop() { super.onStop(); DMRxBus.getDefault().unregister(MessageEvent1.class,MessageEvent2.class); } @Override protected void onDestroy() { super.onDestroy(); DMRxBus.getDefault().destroy(); }}
布局代码:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.dming.testdmbus.MainActivity"> <Button android:id="@+id/sendBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAllCaps="false" android:text="sendMsg"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Msg:" /> <TextView android:id="@+id/msg1Tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/msg2Tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
阅读全文
0 0
- android进阶:利用rxjava写一个超简单的bus
- 简单实现Rxjava框架,超详细,加进阶篇!!!!
- 利用RxJava实现的事件总线(Event Bus)
- 用RxJava写的一个Android的小Demo
- 一个超简单的 android 延时函数
- 利用javascript写一个简单的计算器
- 利用HASH写的一个简单路由
- ::自己写的一个超简单的ASP分页代码::
- 用php写的一个超简单的webservice
- 自己写的一个超简单的伪登录。。。
- 一个基于Win32SDK写的超简单画图板
- android rxjava的简单使用
- 使用RxJava实现的超简单事件总线RxBus
- 利用pyGTK写一个简单的脚本GUI
- 利用JQuery写一个简单的分页插件
- 利用c++写一个很简单的自相关
- 利用反射写一个简单的错误日志插件
- 利用switch ..case写一个简单的计算机函数.
- Word页码设置技巧
- Spring Aop 初探(1)
- Codeforces
- Linux man
- Java开发环境配置-讲解
- android进阶:利用rxjava写一个超简单的bus
- range
- Ubuntu用户及用户组管理命令
- 按每天特定时间作为分界来统计数据的sql语句[sqlserver]
- 2017.7.5工作日记
- Vue中render方法的使用
- Java实例成员和静态成员的理解
- unity学习之飞机大战制作 关键点(三) 设置子弹的生成和移动
- POJ 2815 Context-Free Clock 笔记