EVENTBUS的使用
https://github.com/greenrobot/EventBus
EventBus in 3 steps
Define events:
public static class MessageEvent { /* Additional fields if needed */ }
Prepare subscribers: Declare and annotate your subscribing method, optionally specify a thread mode:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
Register and unregister your subscriber. For example on Android, activities and fragments should usually register according to their life cycle:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
Post events:
EventBus.getDefault().post(new MessageEvent());
注意點 註銷應該寫在onDestroy方法中,在onStart()方法中最好加入判斷是否之前已經註冊了事件
註冊事件中,幾個字段的含義
鏈接:https://www.jianshu.com/p/a040955194fc
在上面的例子中,我們再註解@Subscribe(threadMode = ThreadMode.MAIN)中使用了ThreadMode.MAIN這個模式,表示該函數在主線程即UI線程中執行,實際上EventBus總共有四種線程模式,分別是:
ThreadMode.MAIN:表示無論事件是在哪個線程發佈出來的,該事件訂閱方法onEvent都會在UI線程中執行,這個在Android中是非常有用的,因爲在Android中只能在UI線程中更新UI,所有在此模式下的方法是不能執行耗時操作的。
ThreadMode.POSTING:表示事件在哪個線程中發佈出來的,事件訂閱函數onEvent就會在這個線程中運行,也就是說發佈事件和接收事件在同一個線程。使用這個方法時,在onEvent方法中不能執行耗時操作,如果執行耗時操作容易導致事件分發延遲。
ThreadMode.BACKGROUND:表示如果事件在UI線程中發佈出來的,那麼訂閱函數onEvent就會在子線程中運行,如果事件本來就是在子線程中發佈出來的,那麼訂閱函數直接在該子線程中執行。
ThreadMode.AYSNC:使用這個模式的訂閱函數,那麼無論事件在哪個線程發佈,都會創建新的子線程來執行訂閱函數。
如果用第三和第四個字段,而且再這個方法內部更新主線程的話會報這樣的錯誤
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
如果先發送後寫的註冊代碼,可以用粘性發送
EventBus.getDefault().postSticky(new MessageEvent(“goodEvening”));
意思是如果接受者沒有收到消息,則一直髮送到收到爲止
文件存儲工具類
https://blog.csdn.net/csdnzouqi/article/details/75333266
參考鏈接
https://www.jianshu.com/p/4340ea609ca1
源碼下載
https://download.csdn.net/download/qq_26296197/10888522