這邊文章寫在睡覺前,所以我會寫的很快。
首先我沒用過EventBus,但是我看過它的使用介紹。
大概是這樣用的:
EventBus.getDefault().register(this);
EventBus.getDefault().post(messageEvent);
EventBus.getDefault().unregister(this);
好的,一個非常經典的觀察者模式。
注冊,發送事件,取消注冊。
然后我們自己來實現一下。
首先我們寫一個自己的MyEventBus:
public class MyEventBus {
static MyEventBus myEventBus;
static List<EventListener> listeners = new ArrayList<>();
private MyEventBus(){
}
public static MyEventBus getDefault(){
if(myEventBus==null){
return new MyEventBus();
}else {
return myEventBus;
}
}
public void register(EventListener eventListener){
listeners.add(eventListener);
}
public void unregister(EventListener eventListener){
listeners.remove(eventListener);
}
public void post(String message){
for(EventListener eventListener:listeners){
eventListener.getMessage(message);
}
}
}
MyEventBus是個單例,有個靜態的List<EventListener>管理注冊的類。還有個post方法用來發送消息。
EventListener如下:
public interface EventListener {
void getMessage(String message);
}
一個接口,有個getMessage方法用來接收post的信息。
MainActivity:
public class MainActivity extends AppCompatActivity implements EventListener{
TextView textView;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text_view);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
MyEventBus.getDefault().register(this);
}
@Override
public void getMessage(String message) {
textView.setText(message);
}
@Override
protected void onDestroy() {
super.onDestroy();
MyEventBus.getDefault().unregister(this);
}
}
SecondActivity:
public class SecondActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
Button button = findViewById(R.id.send_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyEventBus.getDefault().post("你好呀,MainActivity");
finish();
}
});
}
}
MainActivity注冊到了MyEventBus的List中,一旦調用了post方法,MainActivity的getMessage(String message)就會收到post過來的方法。
SecondActivity中調用了post方法,它會把信息發給所有注冊者,在這里就是我們的MainActivity。
效果如下:
blogtest.gif
總結:
以上就是EventBus的超超超簡化版,很簡單對不對,不過EventBus的源碼當然不會這么簡單,但是我覺得核心思想就是觀察者模式。
對一個開源框架,我們要了解它的內涵,而不是拿來用,覺得哇好帥啊,就完事了。我們可以看看它的介紹,然后想想如果是自己去寫一個類似的框架,你會怎么寫。
就是這樣,晚安~