2012-11-07 13 views
7

私は昨日スクエアでOTTOを使い始めましたが、これまでは良いスタートを切っていました。他のアクティビティのOTTOとフラグメント

FragmentActivityでホストされているFragmentが既に存在し、そのFragmentActivityでホストされているFragment間の通信が必要な場合、Ottoは素晴らしい機能を発揮します。

すでにホストされている場合は、あなたの#onResume()Methodeのが呼び出されるとフラグメントはEventbusに自身を登録することができます

@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(); 

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)); 

既に表示される場合がありますように、このコードは危険なである:まだあなたがそこにこのようなコードフラグメントをホスティング活動を呼び出したいとき複雑です。アクティビティを開始し、ライフサイクルのためにそのアクティビティが実行できないフラグメントにデータを送信します。アクティビティが作成され、Fragementsも作成されます。ある時点でonResumeメソッドが呼び出されるので、Fragementは@Subscribeを使って自分自身を登録することができます。しかし、これはすべての後にのイベントがEventBus経由で投稿された後に発生します。したがって、Interrestの断片は、EventBusによって決して呼び出されません。

これをスマートな方法で行う方法は誰でも知っていますか?

いくつかの追加情報があります: 私は昨日OTTOで素敵なプレイバックをしました。私のケースでは、APPがタブレットではなくスマートフォンで実行されているときに、別のアクティビティにデータを送信する必要があるときに、問題がプロジェクトでのみ発生します。 IntentとParcelableですべてのデータを送信する前に。オットーはParcleable Objectsを書く必要性を減らすので、私はこのようにしたいと思います。

回答ありがとうございました

答えて

16

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

イベントバスが本当に必要な場合は、最初のアクティビティがなくなってもオブジェクトが存続する必要があります。 Androidでは、これはアプリケーションのコンテキストに関連しているか、DaggerまたはGuiceを使用している場合は@Singletonです。

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

+0

を削除していただきありがとうございます。私はバスができることのdiffernt印象を持っていた。ライフサイクルは単にゲームをプレイしません。だから私はまだ私の断片が何らかの種類のタブレットや電話のモードでイベントを起こすかどうかを知る必要があります。 – Kitesurfer

0

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

+0

私はこれを試しました。私はDeadObject Subscriberをいくつか追加して、すべての未配送オブジェクトを取得しました。私はまだそれが呼び出されるのを見る。私はOTTOコードを真実に掘り下げました。 私にとっては、アクティビティがOTTOへの非同期的な処理を増やして、onResumeが呼び出されることがあるが、そのシナリオの後半になるような問題があるように見える。 私はOTTOへのポストコールを遅らせる必要があります。これは思っています。これは厄介なaswelです。 \t \t IntentTool.showForecastActivity(getSherlockActivity()。getApplicationContext()); \t \t BusProvider.getInstance()。post(新しいイベント(オブジェクト)); – Kitesurfer

+0

イベントバスを間違って使っているようですね。アクティビティの開始時にイベントを送信する必要がある場合は、インテントを通じてデータを渡します。 – SeanPONeil

+0

まあ、私は前にこれをしました。あなたが物事をシンプルにしたい場合は、私は可能な限りバスを使いたいと思っています。私には、入ってくるデータを扱う2つの方法があります。 – Kitesurfer

1

Otake github issueに投稿されたJake Whartonの回答を確認できます。 @Producerを使用できます。

HTTPリクエストを作成して、レスポンスをどこかにキャッシュしておくと(たとえば、従業員のリスト)、ほとんどの人はリクエストを開始し、あるコールバックで応答があったときにその活動を直接行動させます。 onPauseの後とonResumeの前にコールバックが発生すると、デバイスがローテーションされているときと同じように問題が発生します。あなたが代わりにできることは、誰かがそれを受け取ってキャッシュに送るために、HTTPコールがバス上に戻るときにイベントを公開することです。次に、新しい加入者が応答に関心がある場合に、HTTPコールの結果を生成するためにキャッシュと通信するプロデューサを持つことができます。これにより、アクティビティを一時停止して(登録を解除して)コールを返すと、プロデューサが再開(および再登録)されると、プロデューサが呼び出され、アクティビティが通知されます。

関連する問題