EventBus 3.0使用详解

    一、概述

         我们在进行平时的项目开发中,基本上需求都要实现应用程序组件之间的通信,比如在子线程间进行请求数据,当数据请求完毕后通过Handler消息机制来更新UI,当我们项目开发的时间久了会越来越复杂,代码也是会越来越多,那么改如何解决呢,EventBus就帮我们解决了模块与后台线程进行通讯的问题,而且高度耦合。

        那么什么是EventBus呢?

            EventBus能够简化各组件间的通信,让我们的代码书写变的简单,能有效的分离事件发送方和接受方(也就是解耦的意思),能避免复杂和容易出错的依赖性和生命后期的问题。

     二、四种线程模型

          1、POSTING(默认)表示事件处理函数的线程跟发布事件的线程在同一个线程。

            2、MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。

           3、BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。

            4、ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能运行UI操作。

       三、基本用法

          1、自定义一个事件类,说白了也就是JavaBean类

package com.zero.cui.eventbusdemo;

/**
 * Created by y on 2018/5/8.
 */

//定义消息事件类
public class MessageEvent {
    private String message;

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

    public String getMessage() {
        return message;
    }

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


    2、注册事件

            一般都是写在接受消息的Activity类中onCreate方法中

 //注册
        EventBus.getDefault().register(this);
    
public class FirstActivity extends AppCompatActivity {

    private Button mButton;
    private TextView mText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);

        mButton = (Button) findViewById(R.id.btn1);
        mText = (TextView) findViewById(R.id.tv1);
        mText.setText("第一个Activity");
        //注册
        EventBus.getDefault().register(this);

        jumpActivity();
    }

   

      3、解除注册

      写到onDestroy销毁的方法里

//解除注册  
EventBus.getDefault().unregister(this);


    @Override
    protected void onDestroy() {
        super.onDestroy();
//        (如果是已经注册的,就解除注册。)
        if (EventBus.getDefault().isRegistered(this)) {
            //解除注册
            EventBus.getDefault().unregister(this);
        }
    }
}


     4、发送事件

     

//发送事件
EventBus.getDefault().post(new MessageEvent("第二个Activity里发送的消息"));


      5、处理事件

      加上 @Subscribe 注解后,方法名字可以任意取

//处理事件的方法,加上一个注册@Subscribe,并且要指定线程模型,名字可以随便起。
@Subscribe(threadMode = ThreadMode.MAIN)
public void Event(MessageEvent messageEvent){
    mText.setText(messageEvent.getMessage());
}

     四、理论说完上代码

         Bean 实体类

package com.zero.cui.eventbusdemo;

/**
 * Created by y on 2018/5/8.
 */

//定义消息事件类
public class MessageEvent {
    private String message;

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

    public String getMessage() {
        return message;
    }

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


       第一个Activity

 

package com.zero.cui.eventbusdemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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 FirstActivity extends AppCompatActivity {

    private Button mButton;
    private TextView mText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);

        mButton = (Button) findViewById(R.id.btn1);
        mText = (TextView) findViewById(R.id.tv1);
        mText.setText("第一个Activity");
        //注册
        EventBus.getDefault().register(this);

        jumpActivity();
    }
    //跳转页面的方法
    private void jumpActivity(){
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    }
//    四种线程模型
//    POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
//    MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
//    BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
//    ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。



    //处理事件的方法,加上一个注册@Subscribe,并且要指定线程模型,名字可以随便起。
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void Event(MessageEvent messageEvent){
        mText.setText(messageEvent.getMessage());
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
//        (如果是已经注册的,就解除注册。)
        if (EventBus.getDefault().isRegistered(this)) {
            //解除注册
            EventBus.getDefault().unregister(this);
        }
    }
}


    第二个Activity

package com.zero.cui.eventbusdemo;

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

import org.greenrobot.eventbus.EventBus;
//进行事件的发送
public class SecondActivity extends AppCompatActivity {

    private Button mButton2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        mButton2 = (Button) findViewById(R.id.btn2);
        jumpActivity();
    }

    private void jumpActivity(){
        mButton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送事件
                EventBus.getDefault().post(new MessageEvent("第二个Activity里发送的消息"));
                finish();
            }
        });
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值