EventBus 简单使用 和黏性事件

  • 优缺点


  • 调度灵活。不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递。父类对于通知的监听和处理可以继承给子类,这对于简化代码至关重要;通知的优先级,能够保证 Subscriber 关注最重要的通知;粘滞事件(sticky events)能够保证通知不会因 Subscriber 的不在场而忽略。可继承、优先级、粘滞,是 EventBus 比之于广播、观察者等方式最大的优点,它们使得创建结构良好组织紧密的通知系统成为可能。
  • 使用简单。EventBus 的 Subscriber 注册非常简单,调用 eventBus 对象的 register 方法即可,如果不想创建 eventBus 还可以直接调用静态方法 EventBus.getDefault() 获取默认实例,Subscriber 接收到通知之后的操作放在 onEvent 方法里就行了。成为 Publisher 的过程就更简单了,只需要调用合适的 eventBus(自己创建的或是默认的)的 post 方法即可。
  • 快速且轻量。作为 github 的明星项目之一, EventBus 的源代码中许多技巧来改善性能,

eventbus的缺点是他的代码逻辑不是很清楚,在 Subscriber 注册的时候,Subscriber 中的方法会被遍历查找以 onEvent 开头的 public 方法。这将带来一些问题,一旦对代码进行混淆,就无法查找到了。好消息是 EventBus 已经打算使用注解来实现,这应该能够解决代码混淆的问题。

但有一个缺点是观察者独有的,那就是观察者可能会造成接口的膨胀。特别是当程序要求大量形式各异的通知,而程序员有没有做出良好的抽象时,代码中会包含大量的接口,接口数量的增长又会带来命名、注释等等一大堆问题。本质上说观察者要求程序员从零开始实现事件的产生、分发与处理过程,这就要求参与者必须对整个通知过程有着良好的理解。当程序代码适量时,这是一个合理的要求,然而当程序太大时,这将成为一种负担。


最原始的依赖

 compile 'org.greenrobot:eventbus:3.0.0'

两个activity之间传值   一个传递类

package com.example.eventbus;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.greenrobot.eventbus.*;
import org.greenrobot.eventbus.EventBus;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {


    private Button tioa;
    private TextView text;

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

        org.greenrobot.eventbus.EventBus.getDefault().register(this);


    }

    private void initView() {
        tioa = (Button) findViewById(R.id.tioa);
        text = (TextView) findViewById(R.id.text);
        tioa.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tioa:
                Intent intent=new Intent(this,Main2Activity.class);
                startActivity(intent);
                break;
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void kkk(SSS  d){
        Log.d("zzz","MAIN//"+d.getS());

        text.setText(d.getS());
    }
    /*其他线程
    *      ThreadMode.Main:表示这个方法在主线程中执行(适合做异步加载,可以将子线程加载到数据直接设置到UI界面)
              ThreadMode.Posting:表示该方法和消息发送方在同一个线程。
              ThreadMode.ASYNC:表示无论发送方是在子线程还是在主线程,都会开一个新的子线程去运行,适用于多
               个线程任务,内部有线程池管理,比如请求网络时,用这个方法,他会自动创建方法去请求,可以异步并发处理。
             ThreadMode.BackGround:表示该方法在后台运行(也就是子线程),不能够并发处理,如果发布者在子线程,
             那么该方法就在子线程执行。如果发布者在主线程,那么该方法就会创建一个子线程,在子线程运行。
    * */
   /* @Subscribe(threadMode = ThreadMode.ASYNC)
    public void kkk1(SSS  d){
        Log.d("zzz","ASYNC//"+d.getS());
    }
    @Subscribe(threadMode = ThreadMode.POSTING)
    public void kkk2(SSS  d){
        Log.d("zzz","POSTING//"+d.getS());

    }
    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void kkk3(SSS  d){
        Log.d("zzz","BACKGROUND//"+Thread.currentThread().getName());
    }*/
}
//
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.eventbus.MainActivity">

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tioa"
    android:text="跳转到第二个"
    />
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/text"
    />

</LinearLayout>

/第二个activiy
package com.example.eventbus;


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

import org.greenrobot.eventbus.*;

/*
* 导入原始依赖 compile 'org.greenrobot:eventbus:3.0.0'
*
*自定义一个用于传递信息的类   一个数值   构造方法   getset方法
*
* 初始类 (也就是接收值得自定义方法的类) 需要注册和销毁
 * org.greenrobot.eventbus.EventBus.getDefault().register(this);
 *     EventBus.getDefault().unregister(this);
*
*接收值得自定义方法   方法名自定义   必须是公共类型   只能有一个参数   为传递信息类    通过get方法传值
*
*
* 黏性事件
*
* 一方向传递信息的类发送消息  使用  EventBus.getDefault().postSticky(new DDD("今天打老虎"));方法
*
* 另一方接收  使用接收方法时要用
* @Subscribe(threadMode = ThreadMode.MAIN,sticky=true)
    public void zk(DDD ddd){
        text.setText(ddd.getS());
    }

    黏性事件就是  值发送过来后   你可以自己选择什么时候拿这个值    什么时候拿接什么时候注册
    如果不拿    下一个值通过Eventbus过来是会覆盖当前这个值


    注册和销毁  是和接收消息的自定义方法在一个类里面的

*
* */


public class Main2Activity extends AppCompatActivity implements View.OnClickListener {

    private Button hui;

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


    }


    private void initView() {
        hui = (Button) findViewById(R.id.hui);

        hui.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.hui:
               new Thread(){
                   @Override
                   public void run() {
                       super.run();
                       org.greenrobot.eventbus.EventBus.getDefault().post(new SSS("张凯"));
                   }
               }.start();
                break;
        }
    }
}
//布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout

    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.eventbus.Main2Activity"
    android:orientation="vertical"
    >
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="回传"
        android:id="@+id/hui"
        />
</LinearLayout>



package com.example.eventbus;

/**
 * Created by Administrator on 2017/12/27 0027.
 */

public class SSS {
   private String s;

    public SSS(String s) {
        this.s = s;
    }

    public String getS() {
        return s;
    }
}



黏性事件/
 
package com.example.eventbusnian;

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

import org.greenrobot.eventbus.EventBus;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button tiao1;
    @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }
    private void initView() {
        tiao1 = (Button) findViewById(R.id.tiao1);
        tiao1.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tiao1:
                EventBus.getDefault().postSticky(new DDD("今天打老虎"));
                Intent intent=new Intent(this,Main2Activity.class);
                startActivity(intent);
                break;
        }
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" tools:context="com.example.eventbusnian.MainActivity">

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="1111"
    android:id="@+id/tiao1"
    />

</LinearLayout>

package com.example.eventbusnian;

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 Main2Activity extends AppCompatActivity implements View.OnClickListener {

    private Button tiao2;
    private TextView text;

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

    private void initView() {
        tiao2 = (Button) findViewById(R.id.tiao2);
        text = (TextView) findViewById(R.id.text);
        tiao2.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tiao2:
                EventBus.getDefault().register(this);
                break;
        }
    }

    @Subscribe(threadMode = ThreadMode.MAIN,sticky=true)
    public void zk(DDD ddd){
        text.setText(ddd.getS());
    }


    @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:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.eventbusnian.Main2Activity"
    android:orientation="vertical"
    >


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="111"
        android:id="@+id/tiao2"
        />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/text"
        />
</LinearLayout>
/// 
package com.example.eventbusnian;
/**
 * Created by Administrator on 2017/12/27 0027.
 */

public class DDD {
    private String s;
    public DDD(String s) {
        this.s = s;
    }
    public String getS() {
        return s;
    }
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值