您的位置:首页 > 其它

EventBus使用

2016-04-18 15:44 162 查看

序言

刚刚看了EventBus源码解析,自己也写了一个demo。下面简单的介绍一下EventBus.



EventBus是一个为Android设计的事件发布与订阅系统。

注意:要订阅事件,你的类里面必须有一个相应事件的处理方法。改方法必须使用注解Suscribe声明。并且声明为public返回值为void,参数只能有一个。为了接受到事件,需要将你的类注册到EventBus上。在不需要的时候解除注册。

使用

第一步

使用EventBus首先定义一个事件类

public class TestEvent {
public String msg;

public TestEvent(String msg) {
this.msg = msg;
}
}


第二步

然后再你先要处理事件的类中编写,处理方法

//注意在EventBus3.0以后使用注解的形式向EventBus声明这是一个处理指定事件的方法
//至于处理什么事件,则根据方法的参数决定,注意参数有且只有一个。
public void onGetMsg(TestEvent event){
String msg ="get on SecondActivity"+ event.msg;

Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}


第三步

在需要的地方注册,例如在Activity的onCreat方法中,在其他的组件中也可以使用。

EventBus.getDefault().register(this);


在不需要的地方,解除注册,防止内存泄漏。

EventBus.getDefault().unregister(this);


第四步

在需要发布消息的时候调用

//post中为你想发布的消息类型
EventBus.getDefault().post(new TestEvent("post from ThirdActivity"));


Demo

小面是我的一个demo,思路是在第一个Activity中添加事件处理方法,并将自己注册到EventBus,点击按钮跳转到第二个Activity中。在第二个Activity中也有一个按钮,点击按钮发布事件,第一个Activity接受到事件,修改布局中的TextView,并用Toast显示出来。

第一个Activity

package trs.com.learneventbus;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

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

import trs.com.learneventbus.event.TestEvent;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView= (TextView) findViewById(R.id.tv);
findViewById(R.id.btn).setOnClickListener(this);
EventBus.getDefault().register(this);
}

@Subscribe(threadMode = ThreadMode.MAIN,priority = 100)
public void onGetMsg(TestEvent event){
String msg ="get on MainActivity"+ event.msg;
textView.setText(msg);
Toast.makeText(this,msg,Toast.LENGTH_LONG).show();
}

@Override
public void onClick(View v) {
startActivity(new Intent(this,SecondActivity.class));
}

@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}


第一个布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:gravity="center"
android:orientation="vertical"
tools:context="trs.com.learneventbus.MainActivity">

<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<Button

android:text="start"
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>


第二个Activity

public class SecondActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
findViewById(R.id.btn).setOnClickListener(this);
}

@Override
public void onClick(View v) {
EventBus.getDefault().post(new TestEvent("post from ThirdActivity"));
}

}


第二个布局

<?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"
tools:context="trs.com.learneventbus.SecondActivity">
<Button
android:id="@+id/btn"
android:text="post"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>


效果



高级

关于EventBus的高级用法,主要是关于注解Subscribe的使用:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
ThreadMode threadMode() default ThreadMode.POSTING;

/**
* If true, delivers the most recent sticky event (posted with
* {@link EventBus#postSticky(Object)}) to this subscriber (if event available).
*/
boolean sticky() default false;

/** Subscriber priority to influence the order of event delivery.
* Within the same delivery thread ({@link ThreadMode}), higher priority subscribers will receive events before
* others with a lower priority. The default priority is 0. Note: the priority does *NOT* affect the order of
* delivery among subscribers with different {@link ThreadMode}s! */
int priority() default 0;
}


注解中可以设置三个参数,threadMode,sticky,priority。它们表示事件回调的线程方式,是否是粘性的,优先级。

1.threadMode

threadMode是一个枚举,表示事件发生时,对处理方法的回调应该在哪个线程中进行。有四个选项:

类型用途
POSTING表示事件的发布与处理都在同一个线程
MAIN事件的处理会在切换到主线程中,方便更新UI
BACKGROUND事件的处理会在一个单独的线程中,如果发布的线程不是主线程,就直接在发布的线程中回调
ASYNC事件的处理会在一个单独的线程中,与发布事件不是同一个线程,即使不是在主线程中发布的。

2.sticky

如果sticky设置为true,EventBus则会自动的保存最新的一个事件,直到手动的移除,而且发布事件的时候使用的是

EventBus.postSticky(event)


3.priority

priority是一个int类型的数,数值越大,越先接受到事件。

设置方式如下

@Subscribe(threadMode = ThreadMode.MAIN,priority = 100,sticky =true)
public void onGetMsg(TestEvent event){
String msg ="get on MainActivity"+ event.msg;
textView.setText(msg);
Toast.makeText(this,msg,Toast.LENGTH_LONG).show();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: