2013-04-03 2 views
4

Я использую интерфейс Notifications для обновления фрагментов при каждом изменении данных.Android: Когда регистрироваться и регистрироваться для уведомлений?

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, что лучший момент для регистрации и отмены регистрации для получения уведомлений?

Android Lifecycle

Вот несколько сценариев:

Сценарий 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(); 
    } 

Пожалуйста, объясните почему вы бы предложил использовать один или другие i дополнение или другое!

+0

Почему бы вам не зарегистрироваться и не регистрироваться в вашем классе приложений? –

ответ

1

Я бы придерживался сценария 2. Хотя порядок, в котором onPause() и onResume() является линейным для фрагментов, то же самое относится и к деятельности.

fragment_lifecycle

С паузой и резюме фрагментов называют всякий раз, когда деятельность является, вещает будет получено, когда активность активна. Однако активность не вызывает onStop(), пока не потеряет видимость. В этом случае фрагменты все равно будут обрабатывать трансляции, в то время как активность, в которой она содержится, неактивна, что для меня не очень хорошая идея.

2

Существует нет универсального ответа на этот вопрос. onResume/onPause скорее всего будет ожидать ожидаемого поведения большую часть времени, но вы можете столкнуться с ситуациями, когда вы хотите сделать это раньше или позже.

На другой ноте, однако, две точки по стилю и функциональности - вызовите super.onResume в качестве первого в методе (и super.onStop как последний). Таким образом, ваш цикл полностью вложен в «супер» цикл, и вы избегаете странных ошибок и краевых случаев. Кроме того, не всегда нужно звонить notifyDataSetChanged в onResume. На самом деле, это, наверное, довольно расточительная идея.

Смежные вопросы