没时间解释了,快上车!
效果:每点击一下分别加一、加二
学习前提:
1、前提下有rxjava的简单知识。
2、了解:disposable(解除订阅)、PublishSubject(订阅时并不立即触发订阅事件)。
PublishSubject不懂可以看看这个文章:http://blog.youkuaiyun.com/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>