eventbus轻量级的事件发送框架

eventbus类似于广播,发送一个事件,在另外一个activity中接收事件,做出相应的响应,

首先需要导入eventbug包,可以选择导入jar包,也可以在gradle中加入

 compile 'org.greenrobot:eventbus:3.0.0'
我导入的是3.0的eventbus包,接下来上代码,看具体的用法,

首先看下简单的一个效果



界面很简单,只有两个界面,第一个界面是一个按钮和一个显示消息的textview,

第二个界面是一个发送消息的按钮,点击发送事件,第二个界面先出发响应事件,弹出toast,然后第一个界面响应这个事件,并更新UI。

效果和广播很像,但具体的实现却非常简单,代码如下

首先是第一个界面的布局,就是一个button和一个textview


<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.demo.swt.eventbugdemo.MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转到下一个界面" />

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="等待接收信息" />
</LinearLayout>

第一个界面的java页面

package com.demo.swt.eventbugdemo;

import android.content.Intent;
import android.graphics.Color;
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 MainActivity extends AppCompatActivity {
    private TextView textView;
    private Button button;

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

        textView = (TextView) findViewById(R.id.textview);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });

        EventBus.getDefault().register(this);//注册

    }

    //表示在主线程接收消息
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void oninfoChange(MyInfoChange event) {
        textView.setTextColor(Color.RED);
        textView.setText("我接收到了消息");
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//取消注册
    }
}

我们一般选择在oncreate中注册eventbus,在ondestroy中取消注册,和生命周期保持同步,在代码中我们可以看到更新UI的操作,写在一个事件响应的方法中,这个方法体就是一个简单的类,MyInfoChange

package com.demo.swt.eventbugdemo;

/**
 * Created by pc on 2016/11/25.
 */

public class MyInfoChange {
}

而前面的oninfoChange是我们自己定义的一个方法,可以自己命名,

第二个界面布局代码就不上了,就是一个按钮

第二个界面的java代码

package com.demo.swt.eventbugdemo;

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

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

/**
 * Created by pc on 2016/11/25.
 */

public class SecondActivity extends AppCompatActivity {
    private Button mSecondButoon;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        EventBus.getDefault().register(this);

        mSecondButoon = (Button) findViewById(R.id.second_button);
        mSecondButoon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new MyInfoChange());
                finish();
            }
        });




    }
    
    //第二个界面响应事件的方法
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void oninfoChange(MyInfoChange event) {
        Toast.makeText(this,"发送_biubiu",Toast.LENGTH_LONG).show();
    }

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

同样是在oncrete中注册在ondestroy中取消注册,当点击按钮的时候,会发送一条事件EventBus.getDefault().post(new MyInfoChange());

同时结束掉这个activity,在post中new 出响应体,就这样,事件就发送成功了。一般eventbus发送事件,用来更新UI,比如你在下一个界面点击的操作,会对上一个界面造成影响,这个时候就可以用evenbus发送一条事件,在返回到上一个界面的时候自动刷新,而不是去手动刷新,当然还有很多的用法,这里只是举例一个很简单的用法,

PS:threadMode有四种

onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值