zoukankan      html  css  js  c++  java
  • Android之EventBus1.0 和EventBus3.0的使用详解

    当Android项目越来越庞大的时候,应用的各个部件之间的通信变得越来越复杂,那么我们通常采用的就是Android中的解耦组件EventBus。EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

    EventBus文档:http://greenrobot.org/eventbus/documentation

    EventBus源码: https://github.com/greenrobot/EventBus.git

    EventBus框架中涉及四个成分

    订阅者,发布者,订阅事件,事件总线 它们的关系可以用官方的图表示:

    EventBus1.0

    首先你要为你的app添加依赖库:

    compile 'org.simple:androideventbus:1.0.5.1'

    Activity中使用有三部:

    1.注册(onCreate方法下)

    EventBus.getDefault().register(this);

    2.监听(自定义方法即可)

    @Subscriber(tag = Utils.RESULTDATA)
    public void resultData(String title)
    {
      username.setText(title);
    }

    3.解除注册(onDestroy方法下)

    EventBus.getDefault().unregister(this);

    然后就是发布事件让监听事件接受通信信息,在更新UI操作,相关代码如下:

    Activity

    /****
     * eventbus通信
     * 1.0版本
     */
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    
        EditText username;
        EditText password;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.setTitle("登录界面");
            setContentView(R.layout.activity_main);
            EventBus.getDefault().register(this);
            initView();
        }
        private void initView()
        {
            username=(EditText)findViewById(R.id.username);
            password=(EditText)findViewById(R.id.password);
            findViewById(R.id.login).setOnClickListener(this);
            findViewById(R.id.register).setOnClickListener(this);
    
        }
    
        /***
         * (String)->这里可以是任意类型--(在返回的时候对应就行)
         * @param title
         */
        @Subscriber(tag = Utils.RESULTDATA)
        public void resultData(String title)
        {
            username.setText(title);
        }
        //退出
        @Subscriber(tag=Utils.EXIT)
        public void exit(boolean isFang)
        {
            if (isFang) {
                finish();
            }
        }
        @Override
        public void onClick(View v) {
            String name=username.getText().toString();
            String pwd=password.getText().toString();
            switch (v.getId())
            {
                case R.id.login:
                    break;
                case R.id.register:
                    startActivity(new Intent(MainActivity.this,RegisterActivity.class));
                    break;
            }
        }
    
        /***
         * 解除注册
         */
        @Override
        protected void onDestroy() {
            super.onDestroy();
            EventBus.getDefault().unregister(this);
        }
    }

    通信的Activity

    public class RegisterActivity extends AppCompatActivity implements View.OnClickListener{
    
        EditText username;
        LinearLayout linearLayout;
        Button register;
        Button exit;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            this.setTitle("注册界面");
            EventBus.getDefault().register(this);
            initView();
        }
        private void initView()
        {
            username=(EditText)findViewById(R.id.username);
            linearLayout=(LinearLayout)findViewById(R.id.linear);
            linearLayout.setVisibility(View.GONE);
            register=(Button) findViewById(R.id.login);
            register.setText("注册");
            register.setOnClickListener(this);
            exit=(Button)findViewById(R.id.register);
            exit.setText("退出");
            exit.setOnClickListener(this);
    
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId())
            {
                case R.id.login://注册
                    String string=username.getText().toString();
                    if (TextUtils.isEmpty(string))
                    {
                        Toast.makeText(getApplicationContext(),"用户名不能为空",Toast.LENGTH_LONG).show();
                    }
                    else {
                        //发布事件
                        EventBus.getDefault().post(string,Utils.RESULTDATA);
                        finish();
                    }
                    break;
                case R.id.register://退出
                    EventBus.getDefault().post(true,Utils.EXIT);
                    finish();
                    break;
            }
        }
        /***
         * 解除注册
         */
        @Override
        protected void onDestroy() {
            super.onDestroy();
            EventBus.getDefault().unregister(this);
        }
    }

    效果如下图:(包含用户名和退出的通信)

                      

    EventBus3.0

    首先你要为你的app添加依赖库:

    compile 'org.greenrobot:eventbus:3.0.0'

    注册和解除注册相同,监听事件有所改变

    @Subscribe(threadMode = ThreadMode.MAIN)
     public void onUserName(User user)
     {
       username.setText(user.getUsername());
     }

    threadMode的之有四个:

    1. NAIN UI主线程
    2. BACKGROUND 后台线程
    3. POSTING 和发布者处在同一个线程
    4. ASYNC 异步线程

    也可以订阅事件的优先级,需加参数 ,如下:

       /**
         * priority:事件的优先级类似广播的优先级,优先级越高优先获得消息
         * 在ui线程执行
         * @param user
         */
        @Subscribe(threadMode = ThreadMode.MAIN,priority = 100)
          public void onUserName(User user)
         {
            username.setText(user.getUsername());
         }

    除了上面一种事件外,EventBus还有一种黏性事件,意思就是先发布事件,在注册也能监听得到,用postSticky来发布。

    EventBus.getDefault().postSticky(user);
     /**
         * sticky。
         * 方式2
         */
        @Subscribe(sticky = true)
        public void onExit(User user)
        {
            username.setText(user.getUsername());
        }

    EventBus3.0效果如下图:(包含用户名的两种通信方式)

                

    源码点击下载

  • 相关阅读:
    php图片上传代码
    数据库笔记
    数学函数类方法的使用.java
    有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
    现有有N个学生的数据记录,每个记录包括学号、姓名、三科成绩。 编写一个函数input,用来输入一个学生的数据记录。 编写一个函数print,打印一个学生的数据记录。 在主函数调用这两个函数,读取N条记录输入,再按要求输出。 N<100
    求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字
    分数相加减的代码(c++)
    Caesar cipher
    db2、Oracle存储过程引号用法
    CSS基础总结
  • 原文地址:https://www.cnblogs.com/zhangqie/p/6398247.html
Copyright © 2011-2022 走看看