话不多说,直奔主题。
OTTO是Square推出的事件总线库类似的库还有eventbus等,otto的官方地址:https://github.com/square/otto.
1.使用介绍
1.1:首先在项目的build中进行引入:compile ‘com.squareup:otto:+’
1.2:为了使用方便,通常我们会为了使用方便新建一个Mybus继承至Bus,使用单例模式来进行使用,代码如下:
public class MyBus extends Bus {
//通过单例模式返回唯一的bus对象,而且重写父类的post方法,通过handler实现任意线程可以调用
private Handler mHandler = new Handler(Looper.getMainLooper());
private static Bus bus = new MyBus();
private MyBus() {
}
public static Bus getInstance() {
return bus;
}
@Override
public void post(final Object event) {
if (Looper.myLooper() == Looper.getMainLooper()) {
super.post(event);
} else {
mHandler.post(new Runnable() {
@Override
public void run() {
MyBus.super.post(event);
}
});
}
}
}
2.然后创建一个实体类TestUser
public class TestUser {
private String name;
private int age;
public TestUser(String name, int age, int sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
private int sex;
}
3.在activity里面进行注册与发送,发送方式有两种:
第一种:直接通过post(object o)方法进行发送(貌似我没成功)
MyBus.getInstance().post(user);
第二种:通过对方法注解Produce(这种方式是成功了的)
@Produce
public TestUser providerEvent(){
TestUser eventData = new TestUser("测试",18,1);
return eventData;
}
public class WebActivity extends AppCompatActivity {
TextView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
MyBus.getInstance().register(this);
webView = (TextView) findViewById(R.id.tv);
webView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
providerEvent();
// TestUser user=new TestUser("测试",18,1);
// MyBus.getInstance().post(user);
startActivity(new Intent(WebActivity.this, MainActivity.class));
}
});
}
@Produce
public TestUser providerEvent(){
TestUser eventData = new TestUser("测试",18,1);
return eventData;
}
@Override
protected void onDestroy() {
super.onDestroy();
MyBus.getInstance().unregister(this);
}
}
4.在接受的activity或者fragment里面进行注册,在自定义方法里面通过@Subscribe进行操作,代码如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyBus.getInstance().register(this);
}
@Subscribe
//这里的方法名可以随便写,只需要@Subscribe就可以了(注意,括号里面的实体必须是你发送的实体才能接受到数据)
public void onMyEvent(TestUser user) { //如果发送的是UserEvent对象则会接收到信息,否则不会
Log.e("liluo","哈哈哈");
if (user == null || isFinishing()) {
return;
}
Toast.makeText(this, "姓名:" + user.getName() + "年龄:" + user.getAge(), Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
MyBus.getInstance().unregister(this);
}
}
好啦,到此基本使用就结束啦!欢迎熟悉者告知为啥post的方式不能收到消息!谢谢。