Rxbus事件交互

更多内容,关注代码GG微信公众号 :代码GG之家

Rxbus事件交互

源码地址:

https://github.com/luxiaoming/RxBus

demo地址

https://github.com/luxiaoming/RxBusDemo

目标:

使得处理传递数据,不需要接口,直接使用注释关联起来。

使用方法:

第一步

在你的项目gradle文件里面,引入compile 'com.hwangjr.rxbus:rxbus:1.0.3' 导入这个包

有时会出现和其他包冲突,使用:

compile ('com.hwangjr.rxbus:rxbus:1.0.3') {
    exclude group: 'com.hwangjr.utils', module: 'timber'
}  

排除掉里面的冲突包,具体这个语法,可以搜索 gradle 教程。

第二步

写入一个实例,用来构造Rxbus实例,这个是单例模式存在,一般这个实现是放在app创建里面,然后通过接口获取,全局可以使用。

单例代码:

public final class RxBus {
    private static Bus sBus;
    public synchronized static Bus get() {
        if (sBus == null) {
            sBus = new Bus();
        }
        return sBus;
    }
}  

然后我们如下使用:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        //  注册时会自动从当前类里面拿取注释为@Produce 和 @Subscribe,解析处理,会发送出来消息
        //创建的地方注册进来,需要销毁的时候撤销,否则内存泄漏,所以你可以自己封装下baseActivity,完成注册和销毁动作。
        RxBus.get().register(this);
        //也可以自己使用
        RxBus.get().post("hello");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //销毁
        RxBus.get().unregister(this);
    }
    static class  BusAction
    {
       public static final String EAT_MORE="eat_more";
        public static final String EAT_TEST="eat_test";
    }
    //接收一个消息,消息区别是通过参数,因此这里接收一个post事件,参数为字串时,这里就可以收到。
    @Subscribe
    public void eat(String food) {
        Toast.makeText(this,food,Toast.LENGTH_SHORT).show();
    }
    //接收一个列表参数,并且限制这个接收线程是IO,标记为BusAction.EAT_MORE ,标记需要和发送者一致,线程不要需要
    @Subscribe(
            thread = EventThread.MAIN_THREAD,
            tags = {
                    @Tag(BusAction.EAT_TEST)
            }
    )
    public void eatMore(ArrayList foods) {
        // purpose
        Toast.makeText(this,"eatMore",Toast.LENGTH_SHORT).show();
    }
//    @Produce
//    public String produceFood() {
//        return "This is bread!";
//    }
    @Produce(
            thread = EventThread.IO,
            tags = {
                    @Tag(BusAction.EAT_TEST)
            }
    )
    public ArrayList produceMoreFood() {
        ArrayList list =new ArrayList<>();
        list.add("This");
        list.add("is");
        list.add("breads!");
        return list;
    }
}