2

httpリクエストが正常に行われたときに、Ottoを使用して結果をフラグメントに取得しています。

私のアプリケーションにはビューページャーがあります。また、ページは非常に似ているため、データをダウンロードするために、viewpager で異なるデータを持つ同じフラグメントを使用します。

フラグメントメソッドは次のようになります

 @Override
public void onResume() {
    super.onResume();

    MMApp.getBus().register(this);
}


@Override
public void onPause() {
    super.onPause();
    MMApp.getBus().unregister(this);
}

  @Subscribe
public void onHttpResponseReceived(VolleySuccesObject results) {
}

データが混ざり合っています。たとえば、1 ページ目の結果が 2 ページ目にも表示されています。これを解決する方法を知っている人はいますか?

4

2 に答える 2

1

これはViewPager、パフォーマンス上の理由から複数のフラグメントが開始されたままになるためです。どのフラグメントが実際に表示されているかを知りたい場合は、setUserVisibleHint()メソッドをオーバーライドし、バスでフラグメントを登録/登録解除する必要があります。このメソッドのデフォルトは であることに注意してくださいtrue。これは、Android が最初に true 値で呼び出さないことを意味します。したがって、内部のロジックsetUserVisibleHint()は登録ステータスをチェックし、必要な場合にのみregister()/を呼び出すunregister()必要があります。メソッドについても同様ですonStop()。unregister が内部で既に呼び出されている場合はsetUserVisibleHint()、onPause() 内で呼び出す必要はありません。そうしないと、Otto が例外をスローします。

オープンソースのTinyBusは Otto に似た API を使用し、hasRegistered(Object)特定のオブジェクトがバスに登録されているかどうかを確認するために、まさにこの状況のた​​めに呼び出される特別なメソッドを持っています。

于 2015-03-09T11:38:06.323 に答える