EventBusフレームワークの使用の概要
。
EventBus
前書き
EventBusは、Android用に最適化されたパブリッシュ/サブスクライブイベントバスです。これにより、コンポーネント間、およびアプリケーション内のコンポーネントとバックグラウンドスレッド間の通信が簡素化されます。利点は、オーバーヘッドが低く、コードがより洗練され、送信者と受信者が分離されていることです。
。
EventBusの3つの要素
イベント:イベント、任意のタイプのオブジェクトにすることができます
加入者は:イベントの加入者は、中EventBus 3.0我々はいくつかのメソッドのonEvent最初に定義する必要が前に、すなわち
onEvent
、onEventMainThread
、onEventBackgroundThread
とonEventAsync
、と、イベントハンドラの後にメソッド3.0の名で自由に取ることができますが、それはコメントが@subscribe追加する必要がありますスレッドモデルを指定します。デフォルトはPOSTINGです。パブリッシャー:イベントパブリッシャー。任意のスレッドのどこにでもイベントを送信し、直接呼び出すことができます。一般に、EventBus.getDefault()を使用してEventBusオブジェクトを取得してから、post(Object)メソッドを呼び出すことができます。
。
4つのスレッドモデル
EventBus3.0には、次の4つのスレッドモデルがあります。
POSTING(デフォルト):イベント処理関数のスレッドとイベントのスレッドが同じスレッドにあることを示します
MAIN:イベント処理機能のスレッドがメインスレッド(UI)スレッドにあるため、ここでは時間のかかる操作を実行できないことを示します
背景:イベント処理関数のスレッドがバックグラウンドスレッドにあるため、UI操作を実行できないことを示します。イベントを公開するスレッドがメインスレッド(UIスレッド)の場合、イベント処理関数はバックグラウンドスレッドを開始し、イベントを公開するスレッドがバックグラウンドスレッドの場合、イベント処理関数はこのスレッドを使用します
ASYNC:イベントが公開されているスレッドに関係なく、イベント処理関数は常に実行する新しい子スレッドを作成し、UI操作も実行できないことを示します
以下に示すように、イベントを処理するときにスレッドモデルを設定できます。
//设置线程模型
@Subscribe(threadMode = ThreadMode.MAIN)
public void XXXX(MessageWrap message) {
//消息的内容
Log.d("接收的信息内容:",message);
}
。
。
EventBusの基本的な使用法
依存関係を導入する
使用する前に、build.gradle
次の依存関係を導入する必要があります。
dependencies{
implementation 'org.greenrobot:eventbus:3.1.1'
}
。
EventBusの使用は、次の5つのステップに分かれています。
。
1.イベントクラスをカスタマイズします
役割:プログラム内の通信情報としてオブジェクトを使用します
public class MessageEvent {
public final String message;
private MessageEvent(String message) {
this.message = message;
}
public static MessageEvent getInstance(String message) {
return new MessageWrap(message);
}
}
2.イベントを購読する必要があるイベントを登録します
次のように、イベントをMainActivityに登録します。
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_,ain);
initData();
}
public vaid init(){
//注册事件
EventBus.getDefault().register(this);
}
}
3.イベントを送信します
メッセージを公開するためにSecondActivityを作成しました。コードは次のとおりです。
public class SecondActivity extends AppCompatActivity{
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_,ain);
sendMessag();
}
public vaid sendMessag(){
//发送消息
EventBus.getDefault().post(new MessageEvent("你好!我是萝莉"));
}
}
4.イベントレシーバーでイベントを処理します
以下に示すように、MainActivityでイベントを受信し、処理を変更します。
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_,ain);
initData();
}
public vaid init(){
//注册事件
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void GetMessage(MessageWrap message) {
//打印消息的内容
Log.d("接收的信息内容:",message);
}
}
5.イベントサブスクリプションをキャンセルします
MainActivityonDestroy()
では、次のように、unsubscribeイベントメソッドを使用します。
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_,ain);
initData();
}
public vaid init(){
//注册事件
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void GetMessage(MessageWrap message) {
//打印消息的内容
Log.d("接收的信息内容:",message);
}
@Override
protected void onDestroy(){
super.onDestroy();
//取消注册事件
EventBus.getDefault().unregister(this);
}
}
6.ProGuard難読化ルールを追加します
ではproguard-rules.pro
、追加の混乱のルール・ファイル
#eventbus打包混淆
- keepattributes *Annoation*
- keepclassmembers class **{
@org.greenrobot.eventbus.Subscrile<methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode{
*; }
# Only requirend if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.
ThrowableFailurEvent{
<init>(java.lang.Throwable);
}
。
。
EventBusスティッキーイベントの紹介
EventBusは、スティッキーイベントの送信もサポートしています。つまり、スティッキーブロードキャストと同様に、イベントの送信後にイベントをサブスクライブすることでイベントを受信できます。
。
スティッキーイベントを検証するために、前のコードを次のように変更します
1.サブスクライバーはスティッキーイベントを処理します
スティッキーイベントを処理するためにMainActivityに新しいメソッドを記述します
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void GetViscosityMessage(MessageWrap message) {
//打印消息的内容
Log.d("接收的黏性信息内容:",message);
}
2.スティッキーイベントを送信します
SecondActivityでスティッキーイベントを送信する
public vaid sendMessag(){
//发送消息
EventBus.getDefault().postSkticky(new MessageEvent("你好!我是萝莉"));
}
。
。
EventBusサブスクリプションの優先順位の概要
Subscribe注解
3つのパラメータの合計priority
パラメータが優先加入方法は、整数型の値で指定するために使用され、デフォルトは0であり、優先度の大きい値と言いました。イベントが公開されると、優先度の高いサブスクリプション方式が最初にイベントを受け取ります。
使用する:
@Subscribe(threadMode = ThreadMode.POSTING, priority = 0)
注意:
2つのサブスクリプションメソッドが同じThreadModeパラメーターを使用する場合にのみ、それらの優先度は、priorityで指定された値と一致します。
サブスクリプションメソッドのThreadModeパラメーターがPOSTINGの場合にのみ、イベントの継続的な配布を停止できます。
特定の用途:
public class MainActivity extends AppCompatActivity{
// 用来判断是否需要停止事件的继续分发
private boolean stopDelivery = false;
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_,ain);
initData();
}
public vaid init(){
//注册事件
EventBus.getDefault().register(this);
}
/*-------------------- 对事件进行处理 --------------------*/
@Subscribe(threadMode = ThreadMode.POSTING, priority = 0)
public void onGetMessage(MessageWrap message) {
//打印消息的内容
Log.d("接收的信息内容:",message);
}
// 订阅方法,需要与上面的方法的threadMode一致,并且优先级略高
@Subscribe(threadMode = ThreadMode.POSTING, sticky = true, priority = 1)
public void onGetStickyEvent(MessageWrap message) {
//打印消息的内容
Log.d("接收的信息内容:",message);
if (stopDelivery) {
// 终止事件的继续分发
EventBus.getDefault().cancelEventDelivery(message);
}
}
@Override
protected void onDestroy(){
super.onDestroy();
//取消注册事件
EventBus.getDefault().unregister(this);
}
}
。
。
補足:
RxJavaでRxBusを実装する
プロジェクトにRxJavaを導入した場合は、RxJavaを使用して、EventBusとottoの代わりにイベントバスRxBusを実装できます。
依存関係を導入する
使用する前に、build.gradle
次の依存関係を導入する必要があります。
dependencies{
implementation 'io.reactivex:rxjava:1.2.0'
implementation 'io.reactivex:rxandroid:1.2.1'
}
1.RxBusを作成します
最初にRxBusを作成します。ここでのRxBusは基本的な機能のみをサポートします。読者がいくつかの機能を追加したい場合は、それらをカスタマイズできます。コードは次のとおりです。
public class RxBus{
private static volatile RxBus rxBus;
private final Subject<Object,Object> subject = new SerializedSubject<>(PublishSubject.create);
//使用单例模式的双重检查模式
public static RxBus getInstance(){
if(rxBus == null){
synchronized(RxBus.class){
if(rxBus == null){
rxBus = new RxBus();
}
}
}
return rxBus;
}
public void post(Object ob){
subject.onNext(ob);
}
public <T> Observable<T> toObservable(Class<T> eventType){
//ofType方法中包含了filter和cast的操作。
//通过filter操作符来判定是否是指定的类型,如果不是就不提交 给订阅者。
//cast操作符则用来将Observable转换成指定类型的Observable
return subject.ofType(eventType);
}
}
2.イベントを送信します
MainActivityでイベントを送信する
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
public vaid init(){
//发送事情
RxBus.getInstance().post(new MessageEvent("用RxJava实现RxBus"));
}
}
3.イベントを受信する
次のようにTwoActivityでイベントを受信します。
public class TwoActivity extends AppCompatActivity{
private Subscriber subscription;
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
initData();
}
public vaid init(){
//接收消息
subscription = RxBus.getInstance.toObservable(MessageEvent.class).subscribe(new Action1<MessageEvent>(){
@Override
public void call(MessageEvent messageEvent){
Log.v("MainActivity发送过来的消息:",messageEvent.getMessage());
}
}
}
@Override
protected void onDestroy(){
super.onDestroy();
//取消订阅事件
if(subscription != null && !subscription.isUnsubscribed()){
subscription.unsubscribe();
}
}
}