【第二篇】学习 android 事件总线androidEventbus之异步事件的传递

简介: 1,不同Activity直接发送Ansy的事件,以及其他任何事件,必须通过 postSticky方式来进行事件的传递,而不能通过post的形式来进行传递:EventBus.getDefault().postSticky(newUser("soyoungboy","西安财经学院"),"soyoungboy");。

1,不同Activity直接发送Ansy的事件,以及其他任何事件,必须通过

postSticky方式来进行事件的传递,而不能通过post的形式来进行传递:EventBus.getDefault().postSticky(newUser("soyoungboy","西安财经学院"),
"soyoungboy");

2,接受到事件后,很有必要移除事件里面的内容,否则事件内容会多次叠加: EventBus.getDefault().removeStickyEvent(user.getClass(),"ansy") [貌似这个问题只出现在多个Activity之间的事件发送和接收有这问题,但是单个activity里面不会存在这个问题]
3,接收事件相应的时候:除了tag以外还要加上mode,mode = mode =ThreadMode.ASYNC.
4,当然tag可以不用设置,但是发送和接收必须统一,要么都加上,要么都不加。
下面是两个activity之间的ansy事件传递:
  1. package com.example.mysimpleeventbus;
    
    import org.simple.eventbus.EventBus;
    import org.simple.eventbus.Subscriber;
    import org.simple.eventbus.ThreadMode;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.ActionBarActivity;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends ActionBarActivity implements OnClickListener {
    
        private Button button;
        private Button ansyBtn;
        private Button ansy1Btn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
            // 1 首先注册事件总线
            EventBus.getDefault().register(this);
        }
    
        private void initView() {
            button = (Button) findViewById(R.id.button);
            ansyBtn = (Button) findViewById(R.id.ansyBtn);
            ansy1Btn = (Button) findViewById(R.id.ansy1Btn);
    
            button.setOnClickListener(this);
            ansyBtn.setOnClickListener(this);
            ansy1Btn.setOnClickListener(this);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            EventBus.getDefault().unregister(this);
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
            case R.id.button:
    
                postSticky();
    
                break;
    
            case R.id.ansyBtn:
    
                postAnsy();
    
                break;
            case R.id.ansy1Btn:
                
                postAnsyInMainActivity();
                
                break;
            default:
                break;
            }
        }
    
        /**
         * Ansy事件传递,多个Activity之间必须postSticky
         */
        private void postAnsy() {
            // 将目标函数执行在异步线程中
            EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"),
                    "ansy");
            gotoOtherActivity();
        }
    
        /**
         * 在本Activity中进行Ansy事件发布操作
         */
        private void postAnsyInMainActivity() {
            EventBus.getDefault().post(new User("soyoungboy", "西安财经学院"), "ansy");
        }
    
        /**
         * 在本Activity中进行Ansy事件接受操作
         * 
         * @param user
         */
        @Subscriber(tag = "ansy", mode = ThreadMode.ASYNC)
        private void ansy(User user) {
            Log.i("user", user.toString());
            Log.i("ThreadName", Thread.currentThread().getName());
        }
    
        private void postSticky() {
            // 2 发送Sticky事件
            EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"),
                    "soyoungboy");
    
            gotoOtherActivity();
        }
    
        private void gotoOtherActivity() {
            // 跳转页面
            Intent intent = new Intent(MainActivity.this, OtherActivity.class);
            startActivity(intent);
        }
    }

     


 
OtherActivity.java
  1.  1 package com.example.mysimpleeventbus;
     2 
     3 import org.simple.eventbus.EventBus;
     4 import org.simple.eventbus.Subscriber;
     5 import org.simple.eventbus.ThreadMode;
     6 
     7 import android.app.Activity;
     8 import android.os.Bundle;
     9 import android.util.Log;
    10 import android.widget.Toast;
    11 
    12 public class OtherActivity extends Activity {
    13     @Override
    14     protected void onCreate(Bundle savedInstanceState) {
    15         // TODO Auto-generated method stub
    16         super.onCreate(savedInstanceState);
    17         setContentView(R.layout.activity_main);
    18         // 注意此处的registerSticky而不是register
    19         EventBus.getDefault().registerSticky(this);
    20     }
    21 
    22     // 此处获取发送事件的内容
    23     @Subscriber(tag = "soyoungboy")
    24     void showToast(User user) {
    25         Toast.makeText(OtherActivity.this, user.toString(), Toast.LENGTH_LONG)
    26                 .show();
    27     }
    28 
    29     // 获取Ansy异步事件的内容
    30     @Subscriber(tag = "ansy",mode = ThreadMode.ASYNC)
    31     private void ansy(User user) {
    32         Log.i("user", user.toString());
    33         Log.i("ThreadName", Thread.currentThread().getName());
    34         //删除事件,否则会出现重复的响应事件
    35         EventBus.getDefault().removeStickyEvent(user.getClass(), "ansy");
    36     }
    37 
    38     @Override
    39     protected void onDestroy() {
    40         super.onDestroy();
    41         // 同样需要unregister
    42         EventBus.getDefault().unregister(this);
    43     }
    44 }

     



同一个activity内部的内容传递,事件内容不会多次叠加,所以无需删除的操作:
  1 package com.example.mysimpleeventbus;
  2 
  3 import org.simple.eventbus.EventBus;
  4 import org.simple.eventbus.Subscriber;
  5 import org.simple.eventbus.ThreadMode;
  6 
  7 import android.content.Intent;
  8 import android.os.Bundle;
  9 import android.support.v7.app.ActionBarActivity;
 10 import android.util.Log;
 11 import android.view.View;
 12 import android.view.View.OnClickListener;
 13 import android.widget.Button;
 14 
 15 public class MainActivity extends ActionBarActivity implements OnClickListener {
 16 
 17     private Button button;
 18     private Button ansyBtn;
 19     private Button ansy1Btn;
 20 
 21     @Override
 22     protected void onCreate(Bundle savedInstanceState) {
 23         super.onCreate(savedInstanceState);
 24         setContentView(R.layout.activity_main);
 25         initView();
 26         // 1 首先注册事件总线
 27         EventBus.getDefault().register(this);
 28     }
 29 
 30     private void initView() {
 31         button = (Button) findViewById(R.id.button);
 32         ansyBtn = (Button) findViewById(R.id.ansyBtn);
 33         ansy1Btn = (Button) findViewById(R.id.ansy1Btn);
 34 
 35         button.setOnClickListener(this);
 36         ansyBtn.setOnClickListener(this);
 37         ansy1Btn.setOnClickListener(this);
 38     }
 39 
 40     @Override
 41     protected void onDestroy() {
 42         super.onDestroy();
 43         EventBus.getDefault().unregister(this);
 44     }
 45 
 46     @Override
 47     public void onClick(View view) {
 48         switch (view.getId()) {
 49         case R.id.button:
 50 
 51             postSticky();
 52 
 53             break;
 54 
 55         case R.id.ansyBtn:
 56 
 57             postAnsy();
 58 
 59             break;
 60         case R.id.ansy1Btn:
 61             
 62             postAnsyInMainActivity();
 63             
 64             break;
 65         default:
 66             break;
 67         }
 68     }
 69 
 70     /**
 71      * Ansy事件传递,多个Activity之间必须postSticky
 72      */
 73     private void postAnsy() {
 74         // 将目标函数执行在异步线程中
 75         EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"),
 76                 "ansy");
 77         gotoOtherActivity();
 78     }
 79 
 80     /**
 81      * 在本Activity中进行Ansy事件发布操作
 82      */
 83     private void postAnsyInMainActivity() {
 84         EventBus.getDefault().post(new User("soyoungboy", "西安财经学院"), "ansy");
 85     }
 86 
 87     /**
 88      * 在本Activity中进行Ansy事件接受操作
 89      * 
 90      * @param user
 91      */
 92     @Subscriber(tag = "ansy", mode = ThreadMode.ASYNC)
 93     private void ansy(User user) {
 94         Log.i("user", user.toString());
 95         Log.i("ThreadName", Thread.currentThread().getName());
 96     }
 97 
 98     private void postSticky() {
 99         // 2 发送Sticky事件
100         EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"),
101                 "soyoungboy");
102 
103         gotoOtherActivity();
104     }
105 
106     private void gotoOtherActivity() {
107         // 跳转页面
108         Intent intent = new Intent(MainActivity.this, OtherActivity.class);
109         startActivity(intent);
110     }
111 }

 

 
相关文章
|
2月前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
3月前
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
第一个安卓项目 | 中国象棋demo学习
|
2月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
45 1
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
2月前
|
Android开发
Android 事件分发机制详细解读
Android 事件分发机制详细解读
44 5
|
2月前
|
Web App开发 编解码 视频直播
视频直播技术干货(十二):从入门到放弃,快速学习Android端直播技术
本文详细介绍了Android端直播技术的全貌,涵盖了从实时音视频采集、编码、传输到解码与播放的各个环节。文章还探讨了直播中音视频同步、编解码器选择、传输协议以及直播延迟优化等关键问题。希望本文能为你提供有关Andriod端直播技术的深入理解和实践指导。
56 0
|
4月前
|
JavaScript
Vue学习之--------全局事件总线(2022/8/22)
这篇文章介绍了Vue中全局事件总线(GlobalEventBus)的概念和使用方法,它允许不同组件之间进行通信。文章通过图解和代码实例详细解释了如何安装全局事件总线、在组件中接收和提供数据,以及如何在组件销毁前解绑事件,以避免潜在的内存泄漏问题。
Vue学习之--------全局事件总线(2022/8/22)
|
3月前
|
Android开发
Android学习 —— 测试init.rc中的条件触发的处理顺序
Android学习 —— 测试init.rc中的条件触发的处理顺序
|
4月前
|
搜索推荐 Android开发
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
本文分享了不同价位电脑配置对于编译AOSP安卓系统源代码的影响,提供了从6000元到更高价位的电脑配置实例,并比较了它们的编译时间,以供学习AOSP源代码时电脑配置选择的参考。
287 0
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
|
4月前
|
开发工具 Android开发
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
43 0
下一篇
DataWorks