Magren

Magren

Idealist & Garbage maker 🛸
twitter
jike

AndroidのEventBusの使用

これらの日は、Android システムの学習経路をオンラインで探していましたが、アリババの Android 開発マニュアルをアリババのクラウドで見つけました。すでに無料でダウンロードできる場所があるかもしれませんが、無料で手に入れることはできませんので、お金を支払ってサポートしました。実際、1 ドルしかかからず、試験の資格ももらえますので、全体的にはとても快適です。

ウェブサイトは以下の通りです:

アリババの Android 開発マニュアル

おそらく私が接触しているのが少ないため、最初の 1 つ目の項目で混乱しました。

  1. 【強制】Activity 间のデータ通信では、データ量が大きい場合は、Intent + Parcelable の方法を避け、EventBus などの代替案を検討してください。これにより、TransactionTooLargeException の発生を防ぐことができます。

このEventBusって何ですか???

EventBus の概要#

EventBus は、Android のイベントパブリッシュ / サブスクライブフレームワークであり、パブリッシャーとサブスクライバーの解耦を通じて Android のイベント伝達を簡素化します。ここでのイベントはメッセージとして理解することができます。イベントの伝達は、Android の 4 つのコンポーネント間の通信だけでなく、非同期スレッドとメインスレッド間の通信などにも使用できます。
従来のイベント伝達方法には、Handler、BroadcastReceiver、インターフェースコールバックなどがありますが、EventBus の利点は、コードが簡潔で使用が簡単であり、イベントのパブリッシュとサブスクライブを完全に解耦しています。

ここでは、3 つのオブジェクトがあります:

  • イベント:メッセージです。一般的なイベントと Sticky(粘着)イベントに分けられます。Sticky イベントの特殊な点は、イベントが発行された後でも、そのタイプのイベントの最新の Sticky イベントを受け取ることができることです。
  • サブスクライバー:イベントを購読するオブジェクトであり、パブリッシャーがイベントを発行すると、EventBus はサブスクライバーのイベント応答関数を実行します。サブスクライバーは、register インターフェースを使用して特定のイベントタイプを購読し、unregister インターフェースを使用して購読を解除します。
  • パブリッシャー:イベントを発行するオブジェクトであり、post インターフェースを使用してイベントを発行し、黏性イベントは postSticky を使用します。

GitHub のリンク:EventBus

使用方法#

理論は理解していますが、実際にどのように使用するのかを知る必要があります。そうしないと、将来どこにでもコピー&ペーストすることができません。そこで、使用方法を見つけました。

一般的なイベント#

イベントクラスをカスタマイズする
public class Event {

    String message;


    public Event(String message){
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
メッセージを受け取るページで登録する
EventBus.getDefault().register(this);
メッセージを受け取るメソッド
@Subscribe(threadMode = ThreadMode.MAIN)
   public void getEvent(Event event) {
       msg = event.getMessage();
       tv.setText(msg);
   }
イベントを送信する
@OnClick(R.id.bt_return)
    public void renturnActivity(){
        //イベントを送信する
        EventBus.getDefault().post(new Event("Magren"));
        finish();
    }
登録したページが破棄されるときに登録解除する
@Override
    protected void onDestroy() {
        super.onDestroy();
        //登録解除
        EventBus.getDefault().unregister(this);
    }

上記の方法により、MainActivity で EventBus イベントを登録し、応答イベントのメソッドを書き、別の Activity に移動し、ボタンをクリックして MainActivity に Event イベントを送信すると、イベントが受信され、表示されることがわかります。

MainActivity:
eventMain1.png

SendMainActivity:
eventSend.png

MainActivity に戻る:
eventMain2.png

これは一般的なイベントの使用方法ですが、私はデータを現在の Activity から次の Activity に渡し、次の Activity で使用したいと考えていますが、上記の方法ではうまくいかないことに気づきました。後で、ここでは私たちの黏性イベントを使用する必要があることがわかりました。

Sticky イベント#

イベントクラスをカスタマイズする
public class Event {

    String message;


    public Event(String message){
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
メッセージを受け取るページで登録する
EventBus.getDefault().register(this);
メッセージを受け取るメソッド

この場合、sticky = true が追加されます

@Subscribe(sticky = true,threadMode = ThreadMode.MAIN)
    public void getEvent(Event event) {
        msg = event.getMessage();
        tv.setText(msg);
    }
イベントを送信する

メッセージを送信した後に Activity を移動することに注意してください。ここでは postSticky を使用して黏性イベントを送信します。

@OnClick(R.id.bt_return)
   public void renturnActivity(){
       //イベントを送信する
       EventBus.getDefault().postSticky(new Event("Magren"));
       Intent intent = new Intent(this,MainActivity.class);
       startActivity(intent);

   }
登録したページが破棄されるときに登録解除する
@Override
    protected void onDestroy() {
        super.onDestroy();
        //登録解除
        EventBus.getDefault().unregister(this);
    }

これにより、直接次の Activity にイベントを送信し、そこで受信して使用することができます。

1.SendActivity

2.MainActivity

EventBus でイベントを処理するスレッド#

上記の注釈 @Subscribe (threadMode = ThreadMode.MAIN) では、ThreadMode.MAIN というモードが使用されています。これは、イベントがどのスレッドで発行されたかに関係なく、イベントのサブスクライブメソッド onEvent が UI スレッドで実行されることを意味します。これは Android では非常に便利です。なぜなら、Android では UI を更新するには UI スレッドでのみ実行できるためです。したがって、このモードでは、耗費時間のかかる操作を実行することはできません。

  • ThreadMode.POSTING:イベントがどのスレッドで発行されたかに関係なく、イベントのサブスクライブメソッド onEvent は同じスレッドで実行されます。このモードでは、onEvent メソッド内で耗費時間のかかる操作を実行しないでください。耗費時間のかかる操作はイベントの配信の遅延を引き起こす可能性があります。
  • ThreadMode.BACKGROUND:イベントが UI スレッドで発行された場合、サブスクライブメソッド onEvent はサブスレッドで実行されます。イベントが元々サブスレッドで発行された場合、サブスクライブメソッドはそのサブスレッドで直接実行されます。
  • ThreadMode.AYSNC:このモードを使用すると、イベントがどのスレッドで発行されたかに関係なく、新しいサブスレッドが作成され、サブスクライブメソッドがそのサブスレッドで実行されます。

注意点#

  • 登録は通常、onCreate または onStart に記述します。できるだけ onResume には書かないでください。複数回登録される可能性があり、複数回登録するとエラーやアプリのクラッシュが発生する可能性があります。
  • 登録解除は必ず onDestroy に書いてください。onStop に書くと例外が発生する可能性があります。また、チェックやページの終了を引き起こす可能性がありますので、適時登録解除してください。
  • 登録する前に、すでに登録されているかどうかを確認できます。
if (!EventBus.getDefault().isRegistered(this)) {
    EventBus.getDefault().register(this);
}
  • threadMode が宣言されていない場合、デフォルトのスレッドモードは ThreadMode.POSTING です。

以上が私がオンラインでまとめた一部の EventBus の使用方法と私自身の実践です。いつでもブラウズするとわからない知識が見つかります。まだまだ道のりは長いです。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。