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 Lifecycle,注册和注销通知的最佳点是什么?

安卓生命周期

以下是一些场景:

场景一:

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

场景二:

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 可能会在大多数情况下给出预期的行为,但您可能会遇到想要更早或更晚执行此操作的情况。

但是,在不同的方面,关于样式和功能的两点 -super.onResume作为方法中的第一件事(super.onStop也是最后一个)调用。这样,您的循环完全嵌套在“超级”循环中,并且您避免了奇怪的错误和边缘情况。此外,总是调用notifyDataSetChanged. onResume事实上,这可能是一个相当浪费的想法。

于 2013-05-24T18:15:26.013 回答
1

我会坚持使用场景 2。虽然片段的顺序onPause()和顺序onResume()是线性的,但活动的顺序并非如此。

片段生命周期

由于片段的暂停和恢复会在活动开始时被调用,因此只要活动处于活动状态,就会接收到广播。onStop()但是,该活动在失去可见性之前不会调用。在这种情况下,片段仍将处理广播,而它所包含的活动处于非活动状态,这对我来说听起来不是一个好主意。

于 2013-05-21T18:20:05.267 回答