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會立刻收到事件。