EventBus粘性事件

上一篇博客给大家详细的介绍了EeventBus,相信大家有一定的了解了吧,这回给大家解说EventBus粘性事件,它们两个的区别在于实现的方式不同下面给大家介绍EventBus粘性事件和实现方法

概述

EventBus是针一款对Android的发布/订阅事件总线。它可以让我们很轻松的实现在Android各个组件之间传递消息,并且代码的可读性更好,耦合度更低。

导入依赖包:

选择Open Module Settings



点击app,在点击Dependencies,最后点Library dependency


在搜索框中输入eventbus,点击搜索在列表中选择org.greenrobt:eventbus:3.0.0,在点击ok



activity_main.xml布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_Send"
        android:text="主Activity发送数据跳转到接收数据的界面"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"/>

</RelativeLayout>

MainActivity代码:

onCreate();方法里只需调用初始化控件的方法

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

接下来在initIView();进行控件的初始化操作

    private void initView() {
        mButton = (Button) findViewById(R.id.btn_Send);
        mButton.setOnClickListener(this);
    }

最后是按钮的点击事件操作,这这里我们只需做个跳转页面的操作

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_Send:
                //跳转到接收消息的界面
                EventBus.getDefault().postSticky(new EventBusStickyMessage("我是由主页面发送过来的的黏性事件"));
                Intent intent = new Intent(MainActivity.this, EventBusSendActivity.class);
                Toast.makeText(MainActivity.this, "我是从主页面跳转过来的,我将主页面的消息内容呈现到子页面来展示", Toast.LENGTH_LONG).show();
                startActivity(intent);
                break;
        }
    }
}

在这里如果你还没有创建另一个Activity,那就先开始创建吧,创建完成后我们就开始写布局吧,我们只需用一个Button按钮,和一个TextView文本.

Java布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_Receive"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="接收消息"/>

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_Receive"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="35dp"/>

</RelativeLayout>

接着我们创建一个 EventBusStickyMessage一个类,和上一篇的一样,你需要发送什么类型的消息,就定义哪种类型的,我还是定义的 String类型

public class EventBusStickyMessage {
    public String message;


    public EventBusStickyMessage(String message) {
        this.message = message;
    }
}

接下来我们就开始在接受消息的 Activity里写代码了.

boolean flag=true;作用是做个标记,防止EventBus会进行多次注册

initView();调用初始化控件方法

public class EventBusSendActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView mTextView;
    private Button mBtn_receive;


    
    boolean flag = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_bus_send);
        initView();
    }

通过下面的点击事件,我们做一些这样的操作,点击按钮接受粘性数据,实际就是补上注册的环节,是不是听着有点晕啊用心看,注意你一旦注册EventBus就会接收到消息.

   注册:EventBus然后通过判断标记EventBus

  


    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_Receive:
                if (flag) {                    
                    EventBus.getDefault().register(this);
                    //更改标记,使其不会再进行注册,多次注册会报错
                    Toast.makeText(EventBusSendActivity.this, "我收到主页面的消息啦", Toast.LENGTH_SHORT).show();
                    flag = false;
                }
                break;
        }
    }

接受粘性事件,多了一个属性Sticky,改为true启动粘性事件

   @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void EventBusSticky(EventBusStickyMessage eventBusStickyMessage){
        mTextView.setText(eventBusStickyMessage.message);
    }

 注意:有注册就必须解除注册(一般在OnDestroy里执行解注册操作),防止内存泄漏,注册一个界面只能注册一次,否则报错
  @Override
    protected void onDestroy() {
        //移除所有的黏性事件
        EventBus.getDefault().removeAllStickyEvents();
        //解除注册
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }

实现效果

当你点击A页面,将A页面的消息,发送给B页面,通过点击接收消息按钮,将消息用文本展示出来

  A页面                                                                         B页面                                                                 B页面

                                                     




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值