EventBus黏性事件

除了之前讲的普通事件外,EventBus还支持发送黏性事件。何为黏性事件呢?简单讲,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。

本程序为EventBus的黏性事件



代码框架
EventBus黏性事件_第1张图片
效果演示
EventBus黏性事件_第2张图片


实现步骤

关于EventBus的关联
见http://blog.csdn.net/dubuwucool/article/details/53523318


接收窗体布局
xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
  >
    <Button
        android:id="@+id/btn_ok"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="由主页面跳转到发送事件的页面"
        android:textSize="30sp"/>
    <TextView
        android:id="@+id/txtShow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="展示EventBus发送过来的数据"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/btn_ok"/>
RelativeLayout>

发送窗体布局
xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <EditText
        android:id="@+id/edt_Show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:lines="5"
        />

    <Button
        android:id="@+id/btn_Send"
        android:layout_below="@+id/edt_Show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="向主界面发送一个eventBus事件"
        android:textSize="30sp"/>
RelativeLayout
>

黏性消息类
public class EventBusStickMessage {
    public  String Message;
    public  EventBusStickMessage(String message){
        Message =message;
    }
}

发送窗体代码
package com.dubuwucool.eventbus2;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import org.greenrobot.eventbus.EventBus;

public class SendActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_Send;
    private EditText edt_Show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send);
        //初始化控件
        initView();
    }

    private void initView() {
        btn_Send = (Button) findViewById(R.id.btn_Send);

        btn_Send.setOnClickListener(this);
        edt_Show = (EditText) findViewById(R.id.edt_Show);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_Send:
                //获得输入的值
                String content = edt_Show.getText().toString();
                //通过黏性事件将值传到MainActivity窗体中
                EventBus.getDefault().postSticky(new EventBusStickMessage(content));
                Intent intent = new Intent(SendActivity.this, MainActivity.class);
                startActivity(intent);
                break;
        }
    }
}


接收窗体代码

package com.dubuwucool.eventbus2;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_ok;
    private TextView txtShow;
    boolean isTrue true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        initView();
    }

    private void initView() {
        btn_ok = (Button) findViewById(R.id.btn_ok);
        txtShow = (TextView) findViewById(R.id.txtShow);

        btn_ok.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_ok:
                //加一个标识,进行判断,让用户不会因多次点击按钮而注册,从而导致崩溃
               if (isTrue) {
                    //你一旦注册eventBus就会接收消息
                    EventBus.getDefault().register(this);
                    isTrue false;
                }
                break;
        }
    }

    //接收消息  添加注解 如果是黏性事件 将stick设置为true
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void receiveMessage(EventBusStickMessage eventBusStickMessage) {
        txtShow.setText(eventBusStickMessage.Message);
    }
//在onDestory()方法中取消订阅:防止内存溢出
    @Override
    protected void onDestroy() {
        //移除所有黏性事件
        EventBus.getDefault().removeAllStickyEvents();
        //销毁EventBus
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }
}


由此便完成了EventBus黏性事件使用


你可能感兴趣的:(EventBus)