EventBus使用

序言

刚刚看了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();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值