Eventbus3.0简单使用

来源:互联网 发布:熊猫书院 知乎 编辑:程序博客网 时间:2024/06/10 13:10

1.介绍

        首先,来简单的收一下Eventbus,它是一种专门针对Android优化的发布/订阅事件总线。简化了应用程序和各个组件之间与线程之间的通信。优点是开销小,代码少以及将发送者和接受者解耦。如果Activity与Activity之间互相交互的话还好一些,如果说Fragment和Fragment之间交互非常让人头痛,我们有可能会使用广播来处理,或者是setArguments()传递数据。但是这些种方法都是非常消耗时间代码都挺多的,效果而且也并不是很好。今天我们就来学习一下 Eventbus3.0 的使用方法。

2.概念

Eventbus的三要素

Event:事件,可以是任意类型的对象。
Subscriber:事件订阅者,在Eventbus3.0之前,消息处理的方法只能限定与onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync,他们分别代表着四种四种线程模型。而在Eventbus3.0后,事件处理的方法可以随便取名,但是需要添加一个@Subscriber,并且添加指定的线程。
Publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用Eventbus.getDefault.post(Object o)方法就可以发送事件根据post类型会自动订阅该类型的事件。

3.四种线程

  • POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
  • MAIN: 
    事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
  • BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
  • ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。

4.Eventbus3.0的基本用法

   导入依赖包

compile 'org.greenrobot:eventbus:3.0.0'

  定义消息事件类

public class FirstEvent {        private String mMsg;      public FirstEvent(String msg) {              mMsg = msg;      }      public String getMsg(){          return mMsg;      }  }  
在Mantivity中注册和取消事件
import android.content.Intent;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 {    private Button btn;    private TextView tv;      @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);//注册事件        EventBus.getDefault().register(this);        btn = (Button) findViewById(R.id.btn);        tv = (TextView) findViewById(R.id.tv);               btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent i = new Intent(MainActivity.this,Main2Activity.class);                startActivity(i);            }        });           }    //订阅事件    @Subscribe(threadMode = ThreadMode.MAIN)    public void onMoonEvent(FirstEvent messageEvent){        tv.setText(messageEvent.getMsg());    }    //取消事件    @Override    protected void onDestroy() {        super.onDestroy();        EventBus.getDefault().unregister(this);    }}
在Mantivity2中发送事件
import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import org.greenrobot.eventbus.EventBus;public class Main2Activity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);    }    public void btnIn(View v){        //发送事件        EventBus.getDefault().post(new FirstEvent("AAAAAAAAAAAAAAAAAAA"));        finish();    }}
实现效果:
主页面  


进入主页面进行注册事件,点击跳转到第二个页面

点击传值,会发送事件,并且关闭当前页面

我们发送的对象里边就保存了一串这样的文字,这就是效果,就是这么简单。

5.Eventbus3.0的粘性事件

  上边的讲法都很普通,Eventbus3.0还可以支持粘性事件,就是在发送该事件之后在订阅该事件也能收到该事件,对刚才的代码做一点修改
  在Mantivity中依然注册事件,但是我们接受事件的方法不一样
  
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)    public void onNianXing(FirstEvent firstEvent){            tv.setText(firstEvent.getMsg());    }

   当然发送事件的行为也不一样
EventBus.getDefault().postSticky(new FirstEvent("黏性事件"));
实现的效果

点击订阅,开始发送粘性事件

在主页面接收到该事件显示在页面上
好了,小编就先写到这里了,后续会有更好的文章。

推荐   http://www.cnblogs.com/angeldevil/p/3715934.html