話不多說,直奔主題。
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的方式不能收到消息!謝謝。