Android之撸一个类似EventBus的轮子
2018-05-25 本文已影响0人
Android砖家
用过eventBus的人都知道,在组件及时通讯中,使用非常方便。
一般我们是这样做的:总结为三部曲:
//第一步:注册
EventBus.getDefault().register(this);
//第二步:发送消息
EventBus.getDefault().post(messageEvent);
//取消注册
EventBus.getDefault().unregister(this);
这就是EventBus的强大之处,用过的人都说好,哈哈哈哈!!!!
分析轮子的需求背景
上图描述吧。有图有真相
yhx.png
造轮子需要掌握的知识点
说到知识点,很简单,不想说,那就是接口
接下来,就按照EventBus套路来撸一个。
写一个接口,用来接收发送过来的消息
/**
* Created by yi.huangxing on 2018/5/25
* 类描述:
*/
public interface EventListener {
//这里面的的参数根据实际需求定义 Sttring 最好是定义一个实体类,扩展性比较强
void registerMessage(Object object);
}
第二步:XEventBus类
XEventBus类很简单:
1.一个获取单例的方法
2.一个管理List<EventListener>注册类的方法
3.一个发送消息的方法post()
/**
* Created by yi.huangxing on 2018/5/25
* 类描述:
*/
public class XEventBus {
static XEventBus mXEventBus;
static List<EventListener> mListeners = new ArrayList<>();
private XEventBus() {
}
/**
* getDefault 不解释这个取名,按照EventBus来的
*/
public static XEventBus getDefault() {
if (mXEventBus == null) {
return new XEventBus();
} else {
return mXEventBus;
}
}
public void register(EventListener listener) {
mListeners.add(listener);
}
public void unregister(EventListener listener){
mListeners.remove(listener);
}
/**
* 这个方法也不解释,你懂得
*/
public void post(Object object){
for (EventListener eventListener:mListeners) {
eventListener.registerMessage(object);
}
}
}
XEventBus方法的命名都是套路
如何使用? 就这么简单
Maintivity接收:
public class MainActivity extends AppCompatActivity implements EventListener {
private TextView mtv_text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mtv_text =findViewById(R.id.tv_text);
//注册XEventBus
XEventBus.getDefault().register(this);
//
findViewById(R.id.btn_a).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(MainActivity.this,Bctivity.class);
startActivity(intent);
}
});
}
@Override
public void registerMessage(Object object) {
Toast.makeText(this, (String)object, Toast.LENGTH_SHORT).show();
//
mtv_text.setText((String)object);
}
@Override
protected void onDestroy() {
super.onDestroy();
XEventBus.getDefault().unregister(this);
}
}
Cctivity 发送
public class Cctivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cctivity);
//
findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//发送消息
XEventBus.getDefault().post("这是C传过来的消息");
}
});
}
}
就这么简单
yhx.gif