为什么要使用接口参考进行片段间通信?

时间:2019-04-21 09:42:37

标签: java android android-fragments

目前正在学习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);
    }

我不了解接口通信器的必要性。我尝试通过将Fragment1.java中的c变量更改为对象类型MainActivity并完全删除接口来直接引用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 :(得分:0)

使用接口可确保method方法可与实现communicator接口的任何类型的对象一起使用,因此您无需考虑实际的对象类型,只要它是Activity,片段,适配器...

答案 1 :(得分:0)

使用和界面进行通信的想法是创建更简洁,可重用的代码。

无论谁实现 void方法(字符串数据),您的代码都不会中断。无论是通过活动,片段,服务还是任何其他对象来实现。

这是干净架构的原理。当然,它无需接口就可以工作,只需将Fragment1.java中的c变量更改为对象类型MainActivity并完全删除接口即可,直接引用MainActivity 。但是,如果您想更改架构或在其他地方重用它,则需要重构所有代码。

此示例可能为您阐明了这一点:

假设您使用 Pigeon 作为信使发送 message ,如果您认为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");
    }

这样,只要有一个实现了 Messenger 的对象 sender ,您的应用就会发送Messenge(无论如何)。

如果将来您想使用 Raven 发送消息而不是 Pigeon ,只要 Raven 也会实现 Messsenger 界面,您的Fragment不会中断。

因为您的片段既不依赖于 Pigeon ,也不依赖于 Raven ,它依赖于 Messenger ...任何实现的类> Messenger 是从片段的角度发送消息的有效候选人。

您还应该阅读有关依赖项注入的信息