事件总线:EventBus

来源:互联网 发布:网络问卷调查的过程 编辑:程序博客网 时间:2024/05/02 01:51

一、为何使用事件总线

在Android开发中,经常会涉及到Activity、Fragment、Service等不同组件之间或者模块之间的通讯和信息传递,,使用传统的方式,耦合度会很严重,整个代码框架会变得很混乱吗,一个模块的变化可能会引起连锁反应

二 原理

事件总线是基于观察者模式的思想实现的,它使用发布订阅的方式支持组件和模块之间的通讯

事件Event ,只包含数据,不对数据进行操作,

订阅者 Subscriber 订阅者可以订阅事件,可以取消事件,优先级高的订阅者可以先收到事件,并考虑事件是否可以传递下去

发布者 Publisher 事件的源头,发布某种类型的事件对象

EventBus:负责订阅者,事件等信息的存储,同时处理事件的流动和分发

这里写图片描述

三 与广播的区别

虽然广播可以用来实现各种事件的监听,但是广播更加适合用于监听系统Android的广播事件,例如网络的变化,电池的变化,对于业务的数据传递广播使用太过麻烦,虽然事件总线使用起来非常方便,但是也是不能滥用的

四使用模板

1、基本框架搭建

想必大家从一个Activity跳转到第二个Activity的程 序应该都会写,这里先稍稍把两个Activity跳转的#### 代码建起来。后面再添加EventBus相关的玩意。

MainActivity布局(activity_main.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical">      <Button           android:id="@+id/btn_try"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:text="btn_bty"/>      <TextView           android:id="@+id/tv"          android:layout_width="wrap_content"          android:layout_height="match_parent"/>  </LinearLayout>  
新建一个Activity,SecondActivity布局(activity_second.xml)<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical"      tools:context="com.harvic.try_eventbus_1.SecondActivity" >      <Button           android:id="@+id/btn_first_event"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:text="First Event"/>  </LinearLayout>  
2、新建一个类FirstEventpackage com.harvic.other;  public class FirstEvent {      private String mMsg;      public FirstEvent(String msg) {          // TODO Auto-generated constructor stub          mMsg = msg;      }      public String getMsg(){          return mMsg;      }  }  
package com.example.tryeventbus_simple;  import com.harvic.other.FirstEvent;  import de.greenrobot.event.EventBus;  import android.app.Activity;  import android.content.Intent;  import android.os.Bundle;  import android.util.Log;  import android.view.View;  import android.widget.Button;  import android.widget.TextView;  import android.widget.Toast;  public class MainActivity extends Activity {      Button btn;      TextView tv;      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);                  //注册EventBus          EventBus.getDefault().register(this);          btn = (Button) findViewById(R.id.btn_try);          tv = (TextView)findViewById(R.id.tv);          btn.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  // TODO Auto-generated method stub                  Intent intent = new Intent(getApplicationContext(),                          SecondActivity.class);                  startActivity(intent);              }          });      }      @Override      protected void onDestroy(){          super.onDestroy();          EventBus.getDefault().unregister(this);//反注册EventBus      }  }  
package com.example.tryeventbus_simple;  import com.harvic.other.FirstEvent;  import de.greenrobot.event.EventBus;  import android.app.Activity;  import android.os.Bundle;  import android.view.View;  import android.widget.Button;  public class SecondActivity extends Activity {      private Button btn_FirstEvent;      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_second);          btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);          btn_FirstEvent.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  // TODO Auto-generated method stub                  EventBus.getDefault().post(                          new FirstEvent("FirstEvent btn clicked"));              }          });      }  }  
package com.example.tryeventbus_simple;  import com.harvic.other.FirstEvent;  import de.greenrobot.event.EventBus;  import android.app.Activity;  import android.content.Intent;  import android.os.Bundle;  import android.util.Log;  import android.view.View;  import android.widget.Button;  import android.widget.TextView;  import android.widget.Toast;  public class MainActivity extends Activity {      Button btn;      TextView tv;      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          EventBus.getDefault().register(this);          btn = (Button) findViewById(R.id.btn_try);          tv = (TextView)findViewById(R.id.tv);          btn.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  // TODO Auto-generated method stub                  Intent intent = new Intent(getApplicationContext(),                          SecondActivity.class);                  startActivity(intent);              }          });      }      public void onEventMainThread(FirstEvent event) {          String msg = "onEventMainThread收到了消息:" + event.getMsg();          Log.d("harvic", msg);          tv.setText(msg);          Toast.makeText(this, msg, Toast.LENGTH_LONG).show();      }      @Override      protected void onDestroy(){          super.onDestroy();          EventBus.getDefault().unregister(this);      }  }  
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 1岁宝宝不吃辅食怎么办 母乳不够宝宝不吃奶粉怎么办 吃母乳的宝宝不吃奶粉怎么办 宝宝吃母乳不吃奶粉怎么办 1岁婴儿不吃辅食怎么办 不喝奶瓶的宝宝怎么办 母乳不足宝宝不吃奶粉怎么办 4岁宝宝注意力不集中怎么办 孩子上课不专心听讲怎么办 小孩上课不认真听讲怎么办 一年级孩子上课不认真听讲怎么办 打了孩子很自责怎么办 4岁宝宝讲话结巴怎么办 网销客户不说话怎么办 两岁宝宝不说话怎么办? 4岁儿童说话结巴怎么办 3岁宝宝说话结巴怎么办 6岁儿童舌头短怎么办 5岁宝宝说话结巴怎么办 两岁宝宝说话晚怎么办 6岁儿童说话结巴怎么办 2岁宝宝呕吐拉稀怎么办 2岁宝宝突然呕吐怎么办 2岁宝宝呕吐发烧怎么办 2岁宝宝呕吐厉害怎么办 1岁宝宝半夜呕吐怎么办 2岁半宝宝呕吐怎么办 2岁宝宝半夜呕吐怎么办 两岁宝宝一直吐怎么办 原画师老了以后怎么办 孩子不想上学怎么办怎么去说服 嫉妒别人比我好怎么办 三岁宝宝爱打人怎么办 1岁宝宝喜欢打人怎么办 ps图层解锁不了怎么办 沈腾结婚马丽怎么办 延长甲没有纸托怎么办 高考第一志愿没录取怎么办 电子画颜料干了怎么办 数字画颜料干了怎么办 彩砂纸画不好了怎么办