Зачем использовать ссылку на интерфейс для связи между фрагментами? - PullRequest
0 голосов
/ 21 апреля 2019

В настоящее время изучаю Java и Android Studio.Узнав о связи между фрагментами, я заметил, что интерфейс используется для связи фрагмента с Деятельностью.Пример:

MainActivity.java

public class MainActivity extends AppCompatActivity implements communicator{
(...)
public void method(String data){
    }
}

интерфейс коммуникатора

public interface communicator {
public void method(String data);
}

Fragment1.java

public class BlankFragment extends Fragment{
communicator c;
(...)

public void onActivityCreated( Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        c = (communicator) getActivity();
        c.method(data);
    }

Я не понимаю необходимостиинтерфейс коммуникатора.Я попытался сослаться на MainActivity напрямую, изменив переменную c в Fragment1.java на тип объекта MainActivity и полностью удалив интерфейс:

Fragment1.java

public class BlankFragment extends Fragment{
MainActivity c;
(...)

public void onActivityCreated( Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        c = (MainActivity) getActivity();
        c.method(data);
    }

Он работает точно так же.Я подозреваю, что этот дополнительный шаг (реализация интерфейса) может играть большую роль, когда все становится сложнее ??Может кто-нибудь просветить меня об этом.Это менее эффективно или грязно?Спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Идея использования и интерфейса для связи заключается в создании более чистого и многократно используемого кода.

Независимо от того, кто реализует метод void (строковые данные) , ваш код не сломается. Неважно, реализовано ли оно Деятельностью, Фрагментом, Службой или любым другим объектом.

Это принцип чистой архитектуры. Конечно, он будет работать без интерфейса и просто , ссылаясь непосредственно на MainActivity, путем изменения переменной c в Fragment1.java на тип объекта MainActivity и полного удаления интерфейса , как вы сказали. Но если вы хотите изменить свою архитектуру или использовать ее в другом месте, вам нужно будет выполнить рефакторинг всего кода.

Этот пример может прояснить это для вас:

Предположим, вы используете Pigeon в качестве мессенджера для отправки сообщения . Если вы считаете, что Pigeon как Java-класс, он может иметь метод

void sendMessage (String msg);

Кроме того, этот метод может быть частью интерфейса с именем Messenger , а Pigeon может его реализовать:

public interface Messenger{
    void sendMessage (String msg); 
}


public class Pigeon implements Messenger{
    void sendMessage (String msg){
        // Some logic to send a message with a Pigeon
    }
}

И где-то в вашем приложении вы можете отправить сообщение вроде:

public class BlankFragment extends Fragment{
Messenger sender;
(...)

public void onActivityCreated( Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        sender.sendMessage("Hello World");
    }

Таким образом, ваше приложение будет отправлять Messenge (независимо от того, как), пока существует объект sender , который реализует Messenger .

Если в будущем вы захотите использовать Ворон для отправки сообщения вместо Голубь , пока Ворон также реализует Мессенджер интерфейс, ваш фрагмент не сломается.

Поскольку ваш фрагмент не зависит от Pigeon и Raven , он зависит от Messenger ... Любого класса, который реализует Messenger является действительным кандидатом для отправки сообщения с точки зрения вашего фрагмента.

Вы также должны прочитать о внедрении зависимости

0 голосов
/ 21 апреля 2019

Использование интерфейса гарантирует, что метод method будет работать с любым типом объекта, который реализует интерфейс communicator, тогда вам не нужно думать о реальном типе объекта, о том, что это такое: Активность, Фрагмент, Адаптер...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...