目前正在学习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);
}
工作原理相同。我怀疑当事情变得更加复杂时,这个额外的步骤(实现接口)可能会发挥更大的作用?有人可以启发我。这是效率较低还是混乱?谢谢您的时间!
答案 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 是从片段的角度发送消息的有效候选人。
您还应该阅读有关依赖项注入的信息