首先扯点别的:今天下班回家,炒了个土豆丝,那叫一个难吃,平时去饭店里吃饭吃的土豆丝里面就有辣椒和土豆丝,放了点醋。就感觉真是狗都能做土豆丝。但是当自己真正做起来的时候才感觉不是那么简单,虽然什么调料都放了但是就是不好吃。还得勤加练习啊!
今天小结一下自己学习Otto的使用
参考网址 Otto官网 http://square.github.io/otto/
http://www.jianshu.com/p/c8ff4a999a28
http://blog.csdn.net/u010687392/article/details/48244717
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0303/2529.html
Otto 官网上对Otto的介绍的第一句话是:Otto is an event bus designed to decouple different parts of your application while still allowing them to communicate efficiently. 翻译过来就是 :Otto 是一个设计用来保证你的应用能够有效通信的同时并对你的应用进行解耦的事件总线。
Otto中真正用到的就只有一个类两个注解三个方法(摘自:http://blog.csdn.net/u010687392/article/details/48244717)
1 Bus - 管理注册、注销和发布事件
2 @Produce - 标记该方法是生产者,产生的事件内容为该方法的返回值
3 @Subscribe - 标记该方法是订阅者,表示订阅了一个事件,方法需要修饰符为 public,而区分不同的订阅者是通过方法的参数来区分的,且订阅了某事件的所有订5阅者都可以收到该事件
5 register(Object obj) - 注册,订阅事件前都需要注册
6 unregister(Object obj) - 注销,放弃之前所有事件的订阅
7 post(Object event) - 发布一个事件,这个事件会被所有标记了@Subscribe注解的方法获得
第一次使用Otto的时候真的被震撼了,真的很方便,为什么这么说呢,举个简单的例子。
场景是这样的,我有MainActivity,SecondActivity两个Activity ,我点击MainActivity的按钮,进入到 SecondActivity,然后点击SecondActivity 中的一个按钮,更新MainActivity中一个TextView 显示的内容。我们分别看一下Android 原本的实现方式和Otto的实现方式
- Android 实现方式
MainActivity
/在onCreate 方法中 使用 startActivityForResult 的方式跳转到 SecondActivity
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
}
});
//然后MainActivity 重写 onActivityResult 方法,接受传过来的值
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == 1) {
textView.setText(data.getStringExtra("value"));
}
}
SecondActivity
//还没完,在 SecondActivity 中还要把值返回给MainActivity
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putExtra("value", "在secondActivity 中更改 textView 的文字");
SecondActivity.this.setResult(RESULT_OK, intent);
//必须得结束
SecondActivity.this.finish();
}
});
2 Otto 实现方式
首先写一个单例类
public class BusProvider {
private static final Bus BUS=new Bus();
public static Bus getInstance(){
return BUS;
}
private BusProvider(){
}
}
MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//订阅事件
BusProvider.getInstance().register(this);
textView = (TextView) findViewById(R.id.textView);
button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
//用来接受事件的方法,textView改变内容
@Subscribe
public void changeTextView(String text) {
textView.setText(text);
}
@Override
protected void onDestroy() {
//取消订阅
BusProvider.getInstance().unregister(this);
super.onDestroy();
}
SecondActivity
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//发布事件,一句话就解决 就这么轻松加愉快
BusProvider.getInstance().post("在secondActivity 中更改 textView 的文字");
finish();
}
});
通过post()来发布事件,它不需要注册和注销,而且它不会在界面跳转时马上发布事件,而是我们人为的控制该事件什么时候发布
接下来使用一下@Produce 注解,使用方式和@ Subscribe 类似,生产事件前它需要注册、生产完事件后需要注销,如果使用这种方法则在跳转到生产者所在的类中则会立即产生事件触发订阅者。这次我们的事件是一个对象
新建一个事件对象的类
public class TestAction {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
在MainActivity中 新增加一个订阅者,订阅一个TestAction对象
@Subscribe
public void logInfo(TestAction testAction) {
Log.e("tag", testAction.getStr());
}
在SceondActivity中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//注册
BusProvider.getInstance().register(this);
}
//生产事件的方法,进入SceondActivity中,这个方法会立即执行
@Produce
public TestAction produceInfo(){
TestAction testAction =new TestAction();
testAction.setStr("hello world");
return testAction;
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册
BusProvider.getInstance().unregister(this);
}
当我们进入 SceondActivity,produceInfo 立即执行,然后MainActivity中的logInfo方法会立即执行,打印结果
08-24 22:10:42.961 8760-8760/? E/tag: hello world
结尾,今天就总结这么多。