これらの日は、Android システムの学習経路をオンラインで探していましたが、阿里云の阿里ババ Android 開発マニュアルを見つけました。オンラインで無料でダウンロードできる場所もありますが、無料で手に入れることはできませんので、お金を支払ってサポートしました。実際には 1 元しかかからず、試験の資格もありますので、全体的にはとても快適です。
以下のウェブサイトにアクセスしてください:
おそらく私が接触しているのが少ないため、最初の 1 つ目のルールで混乱しました。
- 【強制】Activity 間のデータ通信において、データ量が大きい場合は、Intent + Parcelable の代わりに EventBus などの代替手段を検討して、TransactionTooLargeException を引き起こさないようにしてください。
このEventBusって何ですか???
EventBus の概要#
EventBus は、Android のイベントパブリッシュ / サブスクライブフレームワークであり、パブリッシャーとサブスクライバーを切り離して Android のイベント伝達を簡素化します。ここでのイベントはメッセージとして理解することができます。イベントの伝達は、Android の四大コンポーネント間の通信だけでなく、非同期スレッドとメインスレッド間の通信などにも使用できます。
従来のイベント伝達方法には、Handler、BroadcastReceiver、Interface コールバックなどがありますが、EventBus の利点は、コードが簡潔で使用が簡単であり、イベントのパブリッシュとサブスクライブを完全に切り離しています。
ここでは、3 つのオブジェクトがあります:
- イベント:メッセージです。一般的なイベントと Sticky(粘着性)イベントに分けられます。Sticky イベントの特殊な点は、イベントが発行された後でも、そのタイプのイベントの最新の Sticky イベントを受け取ることができることです。
- サブスクライバー:イベントを購読するオブジェクトであり、パブリッシャーがイベントを発行すると、EventBus はサブスクライバーのイベント応答関数を実行します。サブスクライバーは、register インターフェースを使用して特定のイベントタイプを購読し、unregister インターフェースを使用して購読を解除します。
- パブリッシャー:イベントを発行するオブジェクトであり、post インターフェースを使用してイベントを発行し、sticky イベントは 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:
SendMainActivity:
MainActivity に戻る:
これは一般的なイベントの使用方法ですが、私はデータを現在の Activity から次の Activity に渡し、次の Activity で使用したいと考えていますが、上記の方法を使用してもうまくいきませんでした。後で、ここでは私たちの Sticky イベントを使用する必要があることがわかりました。
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 を使用して Sticky イベントを送信します。
@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 スレッドでのみ 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 の使用方法と自分の実践です。いつでもブラウズしているとわからない知識点が見つかります。まだまだ道のりは長いです。