Android事件總線(三)otto用法全解析
前言
otto 是 Square公司發布的一個發布-訂閱模式框架,它基于Google Guava 項目中的event bus模塊開發,針對Android平臺做了優化和加強。雖然Square已經停止了對otto的更新并推薦使用RxJava和RxAndroid來替代它,但是otto的設計理念和源碼仍舊值得學習,這一篇先來學習下otto的使用方法。
添加依賴庫
首先配置gradle,如下所示。
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; } }
單例封裝Bus
otto的Bus類相當與EventBus中的EventBus類,它封裝了otto的主要功能,但它不是個單例,每次都要用new創建出來,這樣顯然不是很方便,因此我們用單例模式將它封裝起來,如下所示。
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用來發送事件。代碼如下所示。
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來顯示接收到的消息。
使用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的文字變為了”劉望舒的博客更新了”。
使用@Produce來發布事件
Produce注解用來生產發布事件,需要注意的是它生產事件前它需要注冊,并且在生產完事件后需要取消注冊。如果使用這種方法則在跳轉到發布者所在的類中則會立即產生事件并觸發訂閱者,修改SecondActivity,代碼如下所示
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會馬上收到事件。
浙公網安備 33010602011771號