来不及解释了,快上车之EventBus3.0快速上手

作者: JellyCai | 来源:发表于2016-09-27 22:28 被阅读1274次

    快速教你上手EventBus3.0,在EventBus3.0之前用法不同,就不在这里说了。
    准备工作,建立EventBus3.0的依赖:

    compile 'org.greenrobot:eventbus:3.0.0'
    

    基本使用

    1.在需要订阅的组件内注册事件:

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

    2.在结束的时候注销事件:

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

    3.定义接受事件的方法,可以看到下面代码的源注释,当需要定义接受方法的时候,就需要如此申明
    threadMode = ThreadMode.MAIN表示接受的方法发生的线程,其他线程指定的方式在下一章具体解释。
    注意:参数不支持基本数据类型,想用整型必须使用Integer:

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onBus(String msg){
        message.setText(msg);
    }
    

    4.发送事件参数,发送的参数不支持基本数据类型:

    public void oneView(View v){
        EventBus.getDefault().post("开车了");
    }
    

    以上就是EventBus的基本使用了:下面介绍一下简单的用法:

    用法一,同一组件内发送和接收事件

    package com.jelly.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.TextView;
    
    import org.greenrobot.eventbus.EventBus;
    import org.greenrobot.eventbus.Subscribe;
    import org.greenrobot.eventbus.ThreadMode;
    
    public class MainActivity extends AppCompatActivity {
    
        private TextView message;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            message = (TextView) this.findViewById(R.id.message);
            EventBus.getDefault().register(this);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            EventBus.getDefault().unregister(this);
        }
    
        /**
         * 同一界面内传递字符串
         * @param msg
         */
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void onBus(String msg){
            message.setText(msg);
        }
        
    
        public void oneView(View v){
            EventBus.getDefault().post("同一界面内点击");
        }
    }
    

    在Activity的生命周期onCreate方法中注册事件,在onDestroy()方法中注销事件,写了一个在主线程中执行的接收事件的方法修改TextView的值,点击按钮是发送事件。

    用法二,事件传递自定义的对象

    定义一个Bean

    public class Message {
        public String message;
    
        public Message(String message) {
            this.message = message;
        }
    }
    

    事件接收和发送逻辑,在这里发送的是自定义的对象

    package com.jelly.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.TextView;
    
    import org.greenrobot.eventbus.EventBus;
    import org.greenrobot.eventbus.Subscribe;
    import org.greenrobot.eventbus.ThreadMode;
    
    public class MainActivity extends AppCompatActivity {
    
        private TextView message;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            message = (TextView) this.findViewById(R.id.message);
            EventBus.getDefault().register(this);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            EventBus.getDefault().unregister(this);
        }
    
        /**
         * 传递对象
         * @param msg
         */
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void onBus(Message msg){
            message.setText(msg.message);
        }
    
        public void postObj(View v){
            EventBus.getDefault().post(new Message("传递对象"));
        }
    }
    

    用法三,在不同的组件之间发送和接收事件

    接收事件的Activity

    package com.jelly.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.TextView;
    
    import org.greenrobot.eventbus.EventBus;
    import org.greenrobot.eventbus.Subscribe;
    import org.greenrobot.eventbus.ThreadMode;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            message = (TextView) this.findViewById(R.id.message);
            EventBus.getDefault().register(this);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            EventBus.getDefault().unregister(this);
        }
        
        /**
         * 不同组件之间传递数据
         * @param i
         */
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void onBus(Integer i){
            Log.v("bus",i+"");
        }
    
        public void secondView(View v){
            Intent intent = new Intent(this,SecondActivity.class);
            startActivity(intent);
        }
    
    }
    

    发送事件的Activity,刚开始写的时候在发送事件的Activity里面内也加上的注册和注销操作,然后运行失败,在发送事件的组件内不需要在注册和注销EventBus

    package com.jelly.eventbus;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    
    import org.greenrobot.eventbus.EventBus;
    
    /**
     * Created by Jelly on 2016/9/27.
     */
    
    public class SecondActivity extends Activity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.setContentView(R.layout.activity_second);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
        }
    
        public void twoCon(View view){
            Log.v("bus","点击");
            EventBus.getDefault().post(1);
        }
    
    }
    

    在接收事件的Activity中启动发送事件的Activity,点击其中的按钮,打印的日志结果如下

    结果
    更多用法见来不及解释了,快上车之EventBus3.0更多实用使用

    相关文章

      网友评论

      • Android_Happy22:有三个fragment ABC 在c中注册EventBus 跑起来 直接点击B或者C fragment 直接报错??
      • Marno:如果又需要发送又需要接收,不是必须得注册了么?
        Marno:@JellyCai 那还是会运行失败是吧?怎么破? :sweat:
        JellyCai:@Marno 恩恩,是的,如果需要接收的话,就必须注册

      本文标题:来不及解释了,快上车之EventBus3.0快速上手

      本文链接:https://www.haomeiwen.com/subject/dvkhyttx.html