王学岗EventBus

2018-11-07  本文已影响0人  王学岗

第一部分

EventBus的使用步骤:
1,添加jar包/依赖
2,注册 EventBus.getDefault().register(this);
3,解注册 EventBus.getDefault().unregister(this);
防止内存泄漏
4,构造发送消息类 EventBus.getDefault().post();
5,发布消息
6,接收消息
ThreadMode.MAIN; 表示这个方法在主线程中执行
ThreadMode.POSTING 表示该方法在后台执行,不能并发处理。必须等待该线程结束后才能处理其它线程事情
ThreadMode.ASYNC; 表示该方法在后台执行,可以异步兵法处理
ThreadMode.BACKGROUND; 表示该方法和消息发送方在同一个线程中执行

我们看下我们接收消息的页面


package com.example.eventbustest;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1,注册广播
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //2,解除注册
        EventBus.getDefault().unregister(this);
    }
     //5,接收消息
    //添加注释表示接收消息的方法,方法名字自定义,但是参数不能乱写,
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void receiveMessage(MessageEvent messageEvent) {

        Log.i("zhang_xin","接收到的消息:"+messageEvent.getMessage());
        Log.i("zhang_xin","接收到消息的线程:"+Thread.currentThread().getName());

    }

}

我们创建发送消息的类

package com.example.eventbustest;
//3,创建发送消息的类,名字可以随便起
public class MessageEvent {
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    private String message;
}

发送消息的代码

  //4,发送消息,消息的类型必须与@Subscribe注释的方法参数类型一样
        MessageEvent messageEvent=new MessageEvent();
        messageEvent.setMessage("工神黄月英");
        EventBus.getDefault().post(messageEvent);
        startActivity(new Intent(this,MainActivity.class));

看下打印输出结果。


11-07 16:13:50.156 28451-28451/com.example.eventbustest I/zhang_xin: 接收到的消息:工神黄月英
    接收到消息的线程:main

第二部分 粘性事件

使用步骤:
1,添加jar包/依赖
2,构造发送消息类
3,发布消息 EventBus.getDefault().postSticky(messageEvent);
4,接收消息
5,注册 EventBus.getDefault().register(this);
6,解注册 EventBus.getDefault().unregister(this);
防止内存泄漏
注意:粘性事件是先发送消息后注册

1,构造发送消息的类

package com.example.eventbustest;
//1,创建发送粘性消息的类,名字可以随便起
public class MessageEvent {
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    private String message;
}

2,发送粘性事件


 //2,发送粘性事件
        MessageEvent messageEvent=new MessageEvent();
        messageEvent.setMessage("工神黄月英");
        EventBus.getDefault().postSticky(messageEvent);
        startActivity(new Intent(this,MainActivity.class));

后续的步骤


package com.example.eventbustest;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

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

public class MainActivity extends AppCompatActivity {
    private boolean isRegister = false;

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //5,解除注册
        EventBus.getDefault().removeAllStickyEvents();
        EventBus.getDefault().unregister(this);
    }

    //3,接收消息
    //添加注释表示接收消息的方法,方法名字自定义,但是参数不能乱写,
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void receiveMessage(MessageEvent messageEvent) {

        Log.i("zhang_xin", "接收到的消息:" + messageEvent.getMessage());
        Log.i("zhang_xin", "接收到消息的线程:" + Thread.currentThread().getName());

    }

//按钮的点击事件
    public void register(View view) {
        if (isRegister) {
            return;
        } else {
            // 4,注册粘性事件,事件注册一次即可,若连续点击连续注册就会崩溃
            EventBus.getDefault().register(this);
            isRegister = true;
        }
    }
}

我们点击按钮,有如下输出


11-07 16:31:41.956 29616-29616/com.example.eventbustest I/zhang_xin: 接收到的消息:工神黄月英
    接收到消息的线程:main
上一篇 下一篇

猜你喜欢

热点阅读