昨日からOTTO by Squareを使い始めましたが、今のところいいスタートが切れています。
Otto は、FragmentActivity でホストされている Fragment が既にあり、その FragmentActivity によってホストされている Fragment 間で通信する必要がある場合に、すぐに使用できます。
すでにホストされている場合は、 #onResume() メソッドが呼び出され、フラグメントがイベントバスに登録できます。
@Override
public void onResume()
{
super.onResume();
BusProvider.getInstance().register(this);
}
私の問題:
イベントバス経由でイベントを受信する追加のアクティビティに埋め込まれたフラグメントは、次のようになります。
public AnotherFragmentHostedInSomeActivity extends Fragment
{
.....
@Subscribe
public void onSomethingHappend(final Event event)
{
final SomeObject deliveredObject = event.getSomeObject();
しかし、次のコードのような Fragment をホストする別のアクティビティを呼び出したい場合は、まだ複雑なようです。
public class SomeFragmentSendingDataToAnotherFragment extends Fragment
{
...
private void sendData()
{
final Intent intent = new Intent(applicationContext, SomeActivity.class);
applicationContext.startActivity(intent);
BusProvider.getInstance().post(new Event(someObject));
すでにお気づきかもしれませんが、このコードは危険です。ライフサイクルが原因で、アクティビティを開始して、そのアクティビティがホストするフラグメントにデータを送信することはできません。したがって、アクティビティが作成され、フラグメントも作成されます。ある時点で onResume メソッドが呼び出され、フラグメントが @Subscribe を使用して自分自身を登録できるようになります。しかし、これはすべて、イベントが EventBus を介してすでにポストされた後に発生します。そのため、目的のフラグメントが EventBus によって呼び出されることはありません。
スマートな方法でこれを行う方法を知っている人はいますか?
いくつかの追加情報があります: 昨日、OTTO でいい遊びがありました。問題は、別のアクティビティにデータを送信する必要がある場合にのみ、プロジェクトで発生します。これは、私の場合、APP がタブレットではなくスマートフォンで実行されているときに常に発生します。Intent と Parcelable を介してすべてのデータを送信する前に。Otto は Parcleable Objects を書く必要性を減らすので、私はこの方法で行きたいと思います。
回答ありがとうございます