EventBus3.0的使用

1、EventBus

http://greenrobot.org/eventbus/documentation/官方学习文档
http://greenrobot.org/
EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法。特点是代码简洁,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。

在实际开发中经常遇到这样情况
1、activity之间传递数据
2、activity与fragment,fragment与fragment之间传递数据
3、activity与service之间传递数据
4、activiity与broadcast之间传递数据

如果按照android api可能要写很多代码,有时候还要携带context对象,并且很多时间传递给activity后要刷新ui。eventbus帮我们做了大量的这样的工作,代码简介,使用订阅/发布。

EventBus3.0的使用_第1张图片

EventBus属于greenrobot出品,被收录google Guava库,Guava库有很多强大好用的东西

com.google.common.annotations 
com.google.common.base 
com.google.common.base.internal 
com.google.common.cache 
com.google.common.collect 
com.google.common.eventbus 
com.google.common.io 
com.google.common.net 
com.google.common.primitives 
com.google.common.util.concurrent 

在当前流行的retrofit(okhttp)网络库,不仅支持rxjava,java8,还有就是guava库,可以学习一下。

另外greenrobot出口另一个greendao数据库项目也非常好用
在项目中使用eventbus+greendao非常方便

eventbus 使用依赖

 compile 'de.greenrobot:eventbus:3.0.0-beta1'

2、EventBus的使用

1、订阅

订阅就是需要接收方,好像的们订阅的报纸,当有了报纸的时候,快递员就会向我们订阅方送报。比如在这是MainActivity了订阅方。
在这里主要做两件事
一是订阅注册,与取消

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

取消订阅

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

二是订阅事件
就是当订阅发布后,我们在这里做出相应的事件,比如接收数据,更新UI,或者做其他处理。
在这收到发布的信息后,在主线程中设置textview的值,弹出Toast。

  //收到ObjActivity中的数据
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void myEventBusObj(MyEvent myEvent) {
        text.setText(myEvent.getStr());
        Toast.makeText(this, myEvent.getStr(), Toast.LENGTH_SHORT).show();
    }

2、发布

public class ObjActivity extends AppCompatActivity {
    private Button btn_send;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_obj);
        btn_send= (Button) findViewById(R.id.send_obj);
        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new MyEvent("222"));
            }
        });
    }
}

通过MyEvent类发送,也可以简单的只发送一条Message。

public class MyEvent {
    private String str;

    public MyEvent(String str){
        this.str=str;
    }

    public String getStr() {
        return str;
    }
}

3、示例

EventBus3.0的使用_第2张图片

在MainActivity中为订阅者,注册事件,接收事件

package com.example.eventbus;

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

import de.greenrobot.event.EventBus;
import de.greenrobot.event.Subscribe;
import de.greenrobot.event.ThreadMode;
import event.MyEvent;
import event.PersonEvent;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_str;
    private Button btn_obj;
    private Button btn_person;
    private TextView text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
        btn_str = (Button) findViewById(R.id.btn_str);
        btn_obj= (Button) findViewById(R.id.btn_obj);
        btn_person= (Button) findViewById(R.id.btn_person);
        text = (TextView) findViewById(R.id.text);
        btn_str.setOnClickListener(this);
        btn_obj.setOnClickListener(this);
        btn_person.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        Intent intent;
        switch (view.getId()) {
            case R.id.btn_str:
                intent = new Intent();
                intent.setClass(MainActivity.this, StrActivity.class);
                startActivity(intent);
                break;
            case R.id.btn_obj:
                intent = new Intent();
                intent.setClass(MainActivity.this, ObjActivity.class);
                startActivity(intent);
                break;
            case R.id.btn_person:
                intent = new Intent();
                intent.setClass(MainActivity.this, PersonActivity.class);
                startActivity(intent);
                break;
        }
    }


    //收到StrActivity中的字符串数据
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void myEventBusStr(String message) {
        text.setText(message + "");
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
    //收到ObjActivity中的数据
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void myEventBusObj(MyEvent myEvent) {
        text.setText(myEvent.getStr());
        Toast.makeText(this, myEvent.getStr(), Toast.LENGTH_SHORT).show();
    }

    //收到PersonActivity中的的person对象
    @Subscribe(threadMode = ThreadMode.MainThread)
    public void myEventBusPerson(PersonEvent event) {
        text.setText(event.getPerson().getName()+event.getPerson().getAge());
        Toast.makeText(this,event.getPerson().getName()+event.getPerson().getAge(), Toast.LENGTH_SHORT).show();
    }


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

}

第一个ObjActivity,向MainActivity发送MyEvent对象

public class ObjActivity extends AppCompatActivity {
    private Button btn_send;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_obj);
        btn_send= (Button) findViewById(R.id.send_obj);
        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new MyEvent("222"));
            }
        });
    }
}

PersonActivity向MainActivity发送PersonEvent,携带Psrson对象。

public class PersonActivity extends AppCompatActivity {
    private Button btn_person;
    private Person person;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_person);
        btn_person= (Button) findViewById(R.id.send_person);
        person=new Person();
        person.setName("tom");
        person.setAge("20");
        btn_person.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new PersonEvent(person));
            }
        });
    }
}

4、订阅事件线程处理

1、ThreadMode: POSTING

默认为在发送线程执行,推荐使用,这样ThreadMode开销最少,避免线程切换。因此,简单的任务,已经完成时间短,不
需要要线程的

// Called in the same thread (default)
// ThreadMode is optional here
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
    log(event.message);
}

2、ThreadMode: MAIN主线程

使用些模式,在主线程中,可以刷新UI

// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}

3、ThreadMode: BACKGROUND后台线程

// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
    saveToDisk(event.message);
}

4、ThreadMode: ASYNC异步线程

事件处理在一个特殊的线程中处理,并且是一些耗时的操作,比如网络请求数据,数据库查询等。

// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
    backend.send(event.message);
}

5、EventBus运行速度提升

EventBus提升,EventBus3.0使用注解方式,我们都知道注解是基于反射,反射在运行时期获取,一般是普通创建java对象的2倍,但为什么效率会提升呢。
EventBus使用的是编译时期注解,注解分两种,一种是编译时期,另一个是运行时期。在而EventBus是在编译时期的注解,这种注解并不会基于反射动态创建,和Butterknife一样,它生成的代码于普通创建对象一样。

你可能感兴趣的:(android基础)