EventBus
一.EventBus介绍:
EventBus能够简化各组件间的通信,让我们的代码书写变得简单,能有效的分离事件发送方和接收方(也就是解耦的意思)。
二、EventBus三大要素
Event 事件。它可以是任意类型。
Subscriber 事件订阅者。
Publisher 事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。
三、代码实现
package com.example.day11_eventbus;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.EventBusBuilder;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
/**
* 1.添加依赖:'org.greenrobot:eventbus:3.1.1'
* 2.发送者:发布者
* postSticky(Object)
* 3.接收者:订阅者
* 注册 onCreate
* 解除注册 onDestory
* 声明订阅者进行接受消息 @SubScribe
*
*
* **/
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.buyyon);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new DataEvent("王震",17,"被人甩了","2000-08-27"));
}
});
//TODO 1:注册
EventBus.getDefault().register(this);
}
//TODO 3:使用注解声明
//注意 方法必须是 public void 指定线程模型 4种
//ThreadMode.MAIN 主线程
//ThreadMode.ASYNC 子线程
//ThreadMode.BACKGROUND 后台线程
//ThreadMode.POSTING 发布方和接受方在同一个线程种
@Subscribe(threadMode = ThreadMode.MAIN)
public void revicer(DataEvent data){
Toast.makeText(this, data.getName()+data.getAge()+data.getData()+data.getBrithy(), Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
//TODO 2:解除注册
EventBus.getDefault().unregister(this);
}
}
Otto
package com.example.day11_otto;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.squareup.otto.Subscribe;
public class MainActivity extends AppCompatActivity {
/**
* 1.添加依赖:'org.greenrobot:eventbus:3.1.1'
* 2.发送者:发布者
* postSticky(Object)
* 3.接收者:订阅者
* 注册 onCreate
* 解除注册 onDestory
* 声明订阅者进行接受消息 @SubScribe
*
* 4.otto和eventbus的区别
* 1.otto没有bus
* 2.otto不支持粘性广播
* 3.otto不支持线程模型
* **/
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.buyyon);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OttoBus.getDefalut().post(new DataEvent("王震",17,"被人甩了","2000-08-27"));
}
});
//TODO 1:注册
OttoBus.getDefalut().register(this);
}
//TODO 3:使用注解声明
@Subscribe
public void revicer(DataEvent data){
Toast.makeText(this, data.getName()+data.getAge()+data.getData()+data.getBrithy(), Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
//TODO 2:解除注册
OttoBus.getDefalut().unregister(this);
}
}
自定义Bus
package com.example.day11_otto;
import com.squareup.otto.Bus;
//饿汉单例
public class OttoBus extends Bus {
//构造私有化
private OttoBus(){}
//自己实例化
private static OttoBus ottoBus=new OttoBus();
//提供公开方法
public static OttoBus getDefalut(){
return ottoBus;
}
}