EventBus使用過程中,遇到的問題點

2021-07-30 19:06:14 字數 3846 閱讀 5445

說到eventbus,想必大家都不陌生,咦~~~~你沒聽過,好吧,你還要認真學習啊,這篇部落格不是去分析eventbus的原始碼的,也不是講什麼人生哲理,就是教大家如何使用這麼乙個神器,以後誰要是問你eventbus會不會用。。。你就可以驕傲的炫耀你的車技了,並將他領上車

1.初步理解

2.新手入門入門

好了下面直接教大家如何使用 

(1)eventbus配置 

eventbus框架也是採用建造者模式設計的,可以通過eventbusbuilder來設定一些配置資訊,例如設定debug模式下要丟擲異常

eventbus     eventbus=eventbus.builder().throwsubscriberexception(buildconfig.debug

.build();

(2)新增引用
compile 'org.greenrobot:eventbus:3.0.0'
( 3 ) 定義乙個事件型別
public

class myevent

public string getmsg()

public

void

setmsg(string msg)

}

(4)訂閱/解除訂閱
eventbus.getdefault().register(this);//訂閱

eventbus.getdefault().unregister(this);//解除訂閱

有人問我這玩意兒放在**,好吧,我告訴你放在**,首先寫乙個封裝類,

public

class eventutil

}//解除

public

static

void

unregister(object context)

}//傳送訊息

public

static

void

post(object object)

}

然後如果是activity內接收訊息,就在oncreate和ondestroy中呼叫,如果是fragment呢,好吧也是還是在這兩個方法中。。。。。。。不過就變成了

eventutil.register(this);//訂閱事件

eventutil.register(this);//取消事件

(5)發布事件

eventbus.getdefault().post(new datasynevent());
(6)訂閱事件處理
@subscribe(threadmode = threadmode.main) //在ui執行緒執行

public

void

ondatasynevent(datasynevent event)

threadmode總共四個:

nain ui主線程 

background 後台執行緒 

posting 和發布者處在同乙個執行緒 

async 非同步執行緒

他們有啥子用呢,其實就是告訴你只有在主線程中才能更新ui,主線程中不要做耗時操作,如果有必要需要和handler一起使用

(7)訂閱事件的優先順序

說到優先順序,其實和boardcast接收者的優先順序差不多,數越大優先順序越高,一般0-100吧

@subscribe(threadmode = threadmode.main,priority = 100) //在ui執行緒執行 優先順序100

public

void

ondatasynevent(datasynevent event)

有了優先順序,有人就該問了,是不是可以對訊息進行截獲,不讓它往下發呢,這個當然可以了

eventbus.getdefault().canceleventdelivery(event) ;//優先順序高的訂閱者可以終止事件往下傳遞
(8)eventbus黏性事件
我們在學廣播的時候有一種廣播叫粘性廣播。如果使用普通廣播send乙個訊息,然後在你的onreceive中執行超過10秒的話,這個廣播的狀態就會變為可以被乾掉的狀態,而粘性廣播就是為了解除這個10秒限制。但是為了安全起見,忘了在哪個版本的sdk把這玩意給廢棄掉了。
那麼回到我們的問題,當你傳送訊息的時刻和註冊訊息接收的時刻 並不能確定順序,比如你請求網路資料和訂閱事件 同時執行,如果資料返回的特別快呀快,那你 eventutil.register(this)這句**還沒執行完呀,這時候你就就收不到這個訊息了

這個概念這麼理解,就像qq郵件裡有個訂閱的功能,如果你訂閱了乙個公眾郵件, 

那麼他們就會給你推送訊息,但是你卻接收不到你訂閱之前他們推送的訊息

@subscribe(threadmode = threadmode.main,sticky = true) //在ui執行緒執行

public

void

ondatasynevent(datasynevent event)

2.4版本的時候有乙個傳送粘性事件的方法, 後來發現原來3.0還是有這個方法的,所以就這麼傳送粘性事件

eventbus.getdefault().poststicky(new testevent());
我們知道這個粘性事件是存在靜態變數裡的,就是如果你不乾掉他,他就一直在,這時候需要在的ondestory中呼叫這個

eventbus.getdefault().removestickyevent(new testevent());//移除乙個

eventbus.getdefault().removeallstickyevents();//移除全部

(9)eventbus processor使用

專案的build.gradle中配置

buildscript 

}

apt

}dependencies

此時編譯一次,自動生成生成索引類。在\build\generated\source\apt\pakagename\下看到通過註解分析生成的索引類,這樣我們便可以在初始化eventbus時應用我們生成的索引了。

新增索引到eventbus預設的單例中

這玩意主要是為了提高這句**的速度

eventbus.getdefault().register(this);
(10)**的混淆

我發現好多人都為這個問題糾結,最後找不到錯就直接不混淆了,呵呵呵 

先來個全的

-keepattributes *annotation*//keep反射

-keepclassmembers class *

-keep enum org.greenrobot.eventbus.threadmode

# only required if you use asyncexecutor//如果你使用了async 非同步執行緒

-keepclassmembers class * extends

org.greenrobot.eventbus.util.throwablefailureevent

好了關於eventbus的使用就這些內容,如果你想再了解一下原始碼,這裡是傳送門

eventbus 3.0 源**分析 

還有這些個** 

android訊息傳遞之eventbus 3.0使用詳解(三)

Spring data Jpa使用過程中遇到的坑

一定要注意如果我們在實體類中沒有配置資料表的預設值,那麼在存入和取出的時候應該設定。否則在取出的時候就會出現問題。如何通過一方獲取到多方實體 jsp中 jsp資料夾與上面servlet對映名最好不要一致,這樣會出問題 注意!乙個實體類的表id名字請設定為id,保證不出錯。問題分析 解決方法 其實一般...

element ui dialog使用過程中的坑

場景一 我們將dialog寫成乙個可復用的公共元件用於顯示不同內容 如 操作中的修改或新增的彈窗 之後發現dialog的遮罩將彈出層 點選修改或新增後理應由乙個彈窗顯示出來 都蓋住了,而我想要的效果是遮罩只遮住舊的視窗,而當前視窗應該完全顯示 注 是使用easyui的panel和window來包裹的...

Glide使用過程中遇到的坑

專案之前使用的載入庫是universal image loader,但是此庫已經好久不維護了,同時也發現了更加不錯的載入庫,也就是glide,用起來很方便並且記憶體佔用量還很令人滿意,所以決定大刀闊斧的將之前的載入庫換成glide。但是在換使用者頭像相關模組的時候發現問題了,就是載入網路時第一次載入...