4

データが変更されるたびに、インターフェイスを使用してNotificationsフラグメントを更新します。

public interface Notifications {

    void register(ID id, Listener listener);
    void unregister(ID id, Listener listener);
    <T> void post(ID id, T value);

    interface Listener<T> {
        void onEvent(ID id, T value);
    }

    enum ID {
        CustomersUpdated,
        ProductsUpdated
    }

}

Androidライフサイクルについて、通知の登録・解除のポイントは?

Android ライフサイクル

以下にいくつかのシナリオを示します。

シナリオ 1:

public class ProductsListFragment extends BaseFragment 
    implements Notifications.Listener {

    @Override
    public void onStart() {
        mAdapter.notifyDataChanged();
        register(Notifications.ID.ProductsUpdated, this)
        super.onStart();
    }

    @Override
    public void onStop() {
        unregister(Notifications.ID.ProductsUpdated, this)
        super.onStop();
    }

    @Override
    public void onEvent(Notifications.ID id, Object value) {
        mAdapter.notifyDataChanged();
    }

シナリオ 2:

public class ProductsListFragment extends BaseFragment
    implements Notifications.Listener {

    @Override
    public void onResume() {
        mAdapter.notifyDataChanged();
        register(Notifications.ID.ProductsUpdated, this)
        super.onResume();
    }

    @Override
    public void onPause() {
        unregister(Notifications.ID.ProductsUpdated, this)
        super.onPause();
    }

    @Override
    public void onEvent(Notifications.ID id, Object value) {
        mAdapter.notifyDataChanged();
    }

いずれかの実装を使用することをお勧めする理由を説明してください..または別のもの!

4

2 に答える 2

2

この質問に対する普遍的な答えはありません。onResume/onPause は、ほとんどの場合、期待どおりの動作を示しますが、それよりも早くまたは後で実行したい場合に遭遇する可能性があります。

ただし、スタイルと機能に関する 2 つのポイントsuper.onResumeとして、メソッドの最初 (およびsuper.onStop最後) として呼び出します。そうすれば、サイクルは「スーパー」サイクル内に完全にネストされ、奇妙なバグやエッジ ケースを回避できます。notifyDataSetChangedさらに、常に を呼び出すのは得策ではありませんonResume。実際、それはおそらくかなり無駄な考えです。

于 2013-05-24T18:15:26.013 に答える