7

昨日から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 を書く必要性を減らすので、私はこの方法で行きたいと思います。

回答ありがとうございます

4

3 に答える 3

16

2 番目のアクティビティが開始されるまでに、元のアクティビティはなくなります。他の人が指摘しているように、Activity から Activity にデータを渡したい場合は、Intents を使用するのがおそらく最善の方法です。

本当にイベント バスが必要な場合は、最初のアクティビティがなくなった後も生き続けるオブジェクトが必要です。Android では、これは Application コンテキストに関連付けられているか、Dagger または Guice を使用している場合は @Singleton に関連付けられています。

このシングルトンは、Otto の @Produce アノテーションを使用する場所です。2 番目のアクティビティがバスをサブスクライブすると、その @Produce メソッドからデータを受け取ります。

于 2012-11-08T17:03:24.493 に答える
0

@Produce アノテーションを使ってみましたか? 2 番目のアクティビティの Fragment がバスに登録されると、対応する @Produce メソッドを持つ @Subscribe メソッドが実行されます。

于 2012-11-07T13:45:11.333 に答える