2015-05-23 2 views
1

Я новичок в мире Android-программирования, вот мой вопрос.Каков наилучший подход для инициализации интерфейса. (Activity-Frament)?

Предположим, что у меня есть деятельность с именем A и фрагмент с именем F. Я знаю, что взаимодействие между Activity и Fragment должно осуществляться через Interface. Я использовал, чтобы установить Interface в onAttach() из Fragment как этот

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    mListener = (MyListenerInterface) activity; 
} 

и теперь я слышал о Static Factory Method от here. Мой вопрос: Какой лучший подход к init. слушатель? onAttach() или инициализировать слушателя через статический заводский метод, как это?.

public static MyFragment newInstance(MyListenerInterface mListener) { 
     MyFragment f = new MyFragment(); 
     this.mListener = mListener; 
     ........... 
     return f; 
} 

Я думаю, что лучше инициализировать слушателя через static factory method вместо литья от деятельности, таким образом, мы могли бы избежать исключения нулевого указателя.

ответ

1

Да, вам ничего не нужно делать с завода, но onAttach лучше, на мой взгляд, потому что у вас меньше шансов утечки контекста активности. Предположим, вы делаете экземпляр с фабрикой и никогда не используете этот фрагмент, он будет просачивать контекст Activity и там все в нем. Также не забудьте уничтожить интерфейс в onDetach.

Также у вас может быть много экземпляров этого фрагмента и с опцией один, все они будут иметь одинаковый слушатель, а не хорошо.

Также вы должны сделать то, что вы могли бы назвать BaseActivity, абстрактное действие, все остальное простирающееся от и определение методов интерфейса там, и вы избежите всегда бросать много разных классов. Это также пригодится, если вам нужно быстро изменить что-то в каждом действии вашего приложения.

+0

Ничего себе, спасибо за ответ. :) – theapache64

+0

что подразумевается 'не забудьте уничтожить интерфейс в onDetach'? ноль ? Это необходимо для каждого 'onAttach'? – Kiran

+0

onDetach вы должны установить listenerInteface = null, чтобы не вызывать утечек. –

1

Первый вариант (Инициализация слушателя в OnAttach()) является лучшим, потому что один

  • В первой опции MyListenerInterface является не-статической переменной, поэтому каждый фрагмент имеет свой собственный слушателя.
  • Принимая во внимание, что переменная второго значения MyListenerInterface является статикой, которая является ссылкой, поддерживаемой на уровне класса и общей для всех остальных экземпляров фрагмента, это вызывает проблему, когда вам нужен один и тот же фрагмент в различной деятельности, тогда слушатель одного действия будет переопределен с другой деятельностью.
+0

Спасибо за ответ чувак. – theapache64

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