非常实用的传参框架-eventbus

android开发中会经常遇到线程之间,类与类之间的传参问题,之前解决办法很麻烦,但是现在有了传值框架eventbus,只需要注册为订阅者就能接收你想要传递过来的参数了,很方便,再此强烈推荐给大家,快来学习一下吧。

底层:不是广播而是handler

优势:

可以将事件发送给任意组件,将任意参数传递给任意的类。

代码简单逻辑易懂

通过注解的方式标识订阅者

参数怎样传递不再是关注的重点,只需要关注谁是发布者谁是订阅者。


基本使用步骤:

1.添加依赖:

compile 'org.greenrobot:eventbus:3.0.0'


2.定义事件:

public static class MessageEvent { /* Additional fields if needed */ }

 或者直接定义要传递的Message:


Message msg = Message.obtain();
msg.what = 1;
msg.obj = xxx;


3.发送事件

EventBus.getDefault().post(new MessageEvent());

或者直接发送Message

EventBus.getDefault().post(msg);


4.声明和注释你的订阅方法,并选择指定线程模式。里面参数是你传递过来的东西

如果接收的参数是事件,方法参数写MessageEvent类型:

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};

如果接收的参数是消息,方法参数写Message类型

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(Messge msg) {/* Do something */};

5.注册和注销eventbus传参事件。(比如你在service里面订阅的,就写service里面),也可以在oncreate()和ondestroy里面注册和注销。千万不要忘记写这一步,否则你将接收不到你传递过来的参数或者事件。

@Overridepublic void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}
@Overridepublic void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}


注意事项,接收类型必须与发送类型一致,否则不能接收

 

模拟后台下载文件,前台显示进度的一个示例:

添加依赖和权限,以及activityservice在清单文件的配置啥的我就不详细说了。

activity写一个“下载文件”的按钮,点击事件如下:

@OnClick(R.id.bt_download)
public void download() {
    //开启服务
    startService(new Intent(this, DownloadService.class));
    String path = "http://baidu.com/2xx.apk";
    Message msg = Message.obtain();
    msg.obj = path;
    msg.what = 1;
    EventBus.getDefault().post(msg);
}

DownloadService需要获取文件路径,则需要注册成为订阅者,然后开启子线程模拟下载,并把进度发送给activity

public class DownloadService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(Message msg) {
        if (msg.what == 1) {
            Toast.makeText(this, "开始下载" + msg.obj, Toast.LENGTH_SHORT).show();
            //开启子线程模拟更新下载进度
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    for (int i = 0; i <= 100; i++) {
                        Message msg = new Message();
                        msg.obj = i;
                        msg.what = 2;//更新进度
                        EventBus.getDefault().post(msg);
                        SystemClock.sleep(50);
                    }
                }
            }.start();
        }
    }
    @Override
    public void onCreate() {
        super.onCreate();
        EventBus.getDefault().register(this);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}

activity需要获取下载进度更新ui,所以也需要注册成为订阅者

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(Message msg) {
    if (msg.what == 2) {
        btDownload.setText((Integer) msg.obj + "%");
        if ((Integer) msg.obj == 100) {
            btDownload.setText("下载完成");
        }
    }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.inject(this);
    EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
}

点击查看示例moudle



你可能感兴趣的:(Android)