您的位置:首页 > 其它

EventBus简单使用

2016-08-05 17:22 417 查看

简介:

EventBus是基于观察者/订阅者模型



1.订阅者订阅自己希望的事件类型,发布者将事件发送到EventBus后,由EventBus决定将事件交给哪个订阅者处理

2.使用EventBus,EventBus最常用的几个方法原型:

* EventBus.getDefault().register(Object subscriber);

* EventBus.getDefault().unregister(Object subscriber);

* EventBus.getDefault().post(Object event);

第一个为订阅者订阅事件,一旦在类中调用这个方法,EventBus就会遍历类中的方法,将声明为处理事件的方法存起来,等到有订阅者订阅的事件时,就会调用相应的方法处理

第二个为取消注册订阅事件

第三个为发送一个事件到EventBus

注:本文例子中EventBus均为3.X

简单例子

需求为点击第二个页面的按钮,改变第一个页面的文本显示

首先需要定义事件类型,其实也是一个类:

package com.example.eventbussimple;

/**
* Created by user on 2016/8/4 004.
*/
public class EventBean {

public EventBean(String name) {
this.name = name;
}

public String name;
}


第一页代码如下:

package com.example.eventbussimple;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
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 TextView textView;

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

EventBus.getDefault().register(this);//订阅事件
textView = (TextView) findViewById(R.id.id_text1);

findViewById(R.id.id_button1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}
});

}

@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//取消订阅事件
}

//处理事件方法,在3.0以后都需要使用注解来表明这个 方法可以处理EventBus事件
//threadMode会在下面解释
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleMessage(EventBean event) {
textView.setText(event.name);
}
}


第二页代码为

package com.example.eventbussimple;

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 Main2Activity extends AppCompatActivity {

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

Button button = (Button) findViewById(R.id.id_button);
if (button != null) {
//点击按钮发送事件
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new EventBean("xiaowj"));
}
});
}
}
}


至此,点击第二页按钮,第一页的文本就能变为xiaowj

EventBus的ThreadMode

细心的小伙伴在上面的例子中应该注意到了threadMode这个东西,简单来说就是指明处理事件的方法要在哪种线程中执行

ThreadMode有四种枚举类型,下面会一一解释

ThreadMode.POSTING 事件处理函数在事件发送线程中执行。需要尽快处理事件,这种方式是同步调用处理函数,如果长时间处理事件会导致阻塞事件发送线程运行

ThreadMode.MAIN 事件处理函数在主线程中执行(UI线程)。这个不用说,事件处理函数需要尽快处理事件,不然会导致程序无响应

ThreadMode.BACKGROUND 如果发送事件线程是主线程,就新开线程处理这个事件,如果发送事件线程不是主线程,就在发送事件的线程中执行事件处理函数。这个模式也是需要尽快处理事件,如果发送事件线程不是主线程,会同步调用事件处理函数,如果没有快速处理事件, 同样会导致事件发送线程阻塞

ThreadMode.ASYNC 新开线程处理事件,如果事件需要长时间处理,建议选用这种模式开发

各位小伙伴可以根据上面描述选择合适的ThreadMode处理事件

题外话,下周会更新EventBus源码分析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  EventBus