イベントバスのスティッキーイベントは、データの配信に遅れをとります。アクティビティ間でビッグデータを転送する

プロジェクトでの活動の大規模なデータ収集に遭遇しました。EventBusを使用して、従来の機能に遅れをとります。インターネット上にあるアリ開発マニュアルの内容。メモする。

Aliによって与えられた計画は、EventBusを介してデータを送信することです。

 EventBusの固定イベント

EventBusは実際に多くの商用プロジェクトで使用されています。ここでは、EventBusスティッキーイベントを使用してアクティビティ間のデータ転送を完了する方法について簡単に説明します。

EventBusはAndroidに最適化されたパブリッシュ/サブスクライブメッセージバスであり、アプリケーション内のさまざまなコンポーネント間、およびコンポーネントとバックグラウンドスレッド間の通信を簡素化します。

EventBusをアクティビティで使用するには、アクティビティのライフサイクルに従ってregister()メソッドとunregister()メソッドをペアで呼び出す必要があります。通常のイベントはregister()の後でのみ発生し、登録前に発生したイベントは受信されません。

ここでは、EventBusのスティッキーイベントを使用してこれを実現します。EventBusは、スティッキーイベントをキャッシュするためにMapオブジェクトstickyEventsを内部で維持します。

スティッキーイベントはpostSticky()メソッドを使用して送信されます。これは、イベントをstickyEvents Mapオブジェクトにキャッシュするため、次の登録時にイベントが取り出され、登録されたコンポーネントにスローされます。このようにして、スティッキーラギングイベントが送受信されます。

次に、EventBusスティッキーイベントの使用法の詳細を見てみましょう。

1.  アノテーションの違い

stickyイベントの注釈は通常のイベントの注釈とは少し異なり、threadModeおよびstickyパラメーターを追加する必要があります。

@Subscribe(threadMode = ThreadMode.MAIN、sticky = true)

publicvoidonStickyEvent(MyStickyEvent event){

// ...

}

これらの2つの追加パラメーターが必要であることに注意してください。

2.  メソッドの呼び出しの違い

メッセージを送信するときは、postSticky()を使用してpost()メソッドを置き換える必要があります。

スティッキーイベントはMap構造を使用してキャッシュされ、イベントオブジェクトタイプはキャッシュするキーとして使用されるため、同じタイプのデータの場合、最後に送信されたデータのみがキャッシュされることに注意してください。

3.  クリーンアップインシデントに注意する

前述のように、スティッキーイベントはMapオブジェクトに格納されます。マップオブジェクトに格納されているオブジェクトはアクティブにクリーンアップされません。開発者は手動でクリーンアップする必要があります。

EventBusは、removeStickyEvent()およびremoveAllStickyEvents()という2種類のメソッドを提供します。これらは、それぞれ固定データとすべてのデータをクリーンアップするために使用されます。

スティッキーイベントをクリーンアップするには、これらの2つのメソッドを適切なタイミングで手動で呼び出す必要があります。スティッキーイベントをクリーンアップしないと、register()を実行するたびにスティッキーイベントを受け取ります。

4.  EventBusスティッキーイベント

スティッキーイベント自体は、Android Intentのデータ転送メカニズムから分離されています。特別な状況では、アクティビティが破棄されて再構築されることを知っておくことが重要です。この場合、Intentを通過したデータは引き続きIntentから復元できます最後のページで渡されたデータ。

ただし、EventBusを介したスティッキーイベントは、破壊および再構築中にデータの損失を引き起こす可能性があります。

EventBusスティッキーイベントを使用してページ間でビッグデータを転送する場合でも、ビジネスに応じて調整する必要のある詳細は数多くあります。

第四に、要約の瞬間

今日は、アクティビティ間でIntentを介してビッグデータを渡すことによってTransactionTooLargeExceptionがトリガーされる理由とそれを解決する方法について説明し、最後に簡単にまとめます。

  1. Intentは内部的にBinder通信メカニズムを使用するため、大きなデータを転送できません。また、Binderトランザクションバッファーは転送されるデータのサイズを制限します。
  2. バインダートランザクションバッファーのサイズは1MBに制限されていますが、このサイズは共有されているため、現在の環境によっては、1MB未満のデータを送信することが絶対的に安全というわけではありません。
  3. インテントによって送信されるデータのサイズの制限に挑戦しないでください。長い文字列やビットマップなどの大きなデータの場合は、インテントによるデータ送信のスキームを考慮しないでください。
  4. ビッグデータ転送の問題を解決するには、データソースから始めて、データの識別に従ってデータを復元するか、最初に永続化してから復元します。EventBusスティッキーイベントを使用して解決することもできます。

おすすめ

転載: blog.csdn.net/qq_36355271/article/details/101264339