otto 是 Square公司发布的一个发布-订阅模式框架,它基于Google Guava 项目中的event bus模块开发,针对Android平台作了优化和增强。虽然Square已经中止了对otto的更新并推荐使用RxJava和RxAndroid来替代它,可是otto的设计理念和源码仍旧值得学习,这一篇先来学习下otto的使用方法。git
首先配置gradle,以下所示。github
compile 'com.squareup:otto:1.3.8'
与EventBus同样,咱们接着定义消息类,它是一个bean文件,以下所示。框架
public class BusData { public String message; public BusData(String message){ this.message=message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
otto的Bus类至关与EventBus中的EventBus类,它封装了otto的主要功能,但它不是个单例,每次都要用new建立出来,这样显然不是很方便,所以咱们用单例模式将它封装起来,以下所示。ide
public class OttoBus extends Bus{ private volatile static OttoBus bus; private OttoBus (){ } public static OttoBus getInstance() { if (bus == null) { synchronized (OttoBus.class){ if(bus==null){ bus = new OttoBus(); } } } return bus; } }
otto一样须要注册和取消注册订阅事件,经过OttoBus获得Bus对象,调用Bus的register和unregister方法来注册和取消注册,同时咱们定义一个button,点击这个button跳转到SecondActivity,SecondActivity用来发送事件。代码以下所示。post
public class MainActivity extends AppCompatActivity { private Button bt_jump; private TextView tv_message; private Bus bus; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_message= (TextView) this.findViewById(R.id.tv_message); bt_jump= (Button) this.findViewById(R.id.bt_jump); bt_jump.setText("跳转到SecondActivity"); bt_jump.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this,SecondActivity.class)); } }); bus=OttoBus.getInstance(); bus.register(this); } @Override protected void onDestroy() { super.onDestroy(); //取消注册订阅事件 bus.unregister(this); }
和EventBus同样用@Subscribe来订阅事件,在MainActivity中添加以下代码。学习
@Subscribe public void setContent(BusData data) { tv_message.setText(data.getMessage()); }
一样的用textView来显示接收到的消息。gradle
使用post发送事件
建立SecondActivity,并设置一个button,点击发送事件,并finish掉自身,以下所示。优化
public class SecondActivity extends AppCompatActivity { private Button bt_jump; private OttoBus bus; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt_jump= (Button) this.findViewById(R.id.bt_jump); bt_jump.setText("发送事件"); bt_jump.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { OttoBus.getInstance().post(new BusData("刘望舒的博客更新了")); finish(); } }); } }
这样咱们运行程序点击MainActivity的”跳转到SecondActivity”按钮直接跳转到SecondActivity,再点击”发送事件”按钮,SecondActivity被finish掉回到MainActivity ,MainActivity 中的textView的文字变为了”刘望舒的博客更新了”。this
使用@Produce来发布事件
Produce注解用来生产发布事件,须要注意的是它生产事件前它须要注册,而且在生产完事件后须要取消注册。若是使用这种方法则在跳转到发布者所在的类中则会当即产生事件并触发订阅者,修改SecondActivity,代码以下所示spa
public class SecondActivity extends AppCompatActivity { private Button bt_jump; private OttoBus bus; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt_jump= (Button) this.findViewById(R.id.bt_jump); bt_jump.setText("发送事件"); bt_jump.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); bus=OttoBus.getInstance(); bus.register(this); } @Produce public BusData setInitialContent() { return new BusData("刘望舒的博客更新了"); } @Override protected void onDestroy() { super.onDestroy(); bus.unregister(this); } }
在MainActivity跳转到SecondActivity时,MainActivity会立刻收到事件。