为何ISignaller接口方法在MainActivity生效,FirstFragment未触发?
问题原因及修复方案
核心问题点
1. 接口类型不兼容
FirstFragment实现的是ISignaller接口,但MainActivity的setPublisher方法接收的参数类型是ISignaller2。这两个是完全独立的接口,即便方法名相同,也无法互相替代。MainActivity中调用publisher.onPublishMessage(message)时,只会触发ISignaller2接口的方法,而FirstFragment并未实现该接口,自然不会被调用。
2. Fragment获取Activity的时机错误
在FirstFragment的成员变量初始化阶段直接调用getActivity()会返回null——此时Fragment还未依附到Activity上,后续的setPublisher和start调用根本不会执行,等于没把FirstFragment设置成publisher。
修复步骤
步骤1:修正FirstFragment的接口实现与生命周期逻辑
让FirstFragment实现ISignaller2接口,并在正确的生命周期方法中获取Activity实例:
public class FirstFragment extends Fragment implements ISignaller2 { // 实现ISignaller2的方法,此时会被MainActivity调用 @Override public void onPublishMessage(String message) { Log.i("TAG", message); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); MainActivity mMainActivity = (MainActivity) getActivity(); if (mMainActivity != null) { mMainActivity.setPublisher(this); mMainActivity.start(); } } }
步骤2:补全MainActivity的变量声明与空判断
确保MainActivity中正确声明publisher变量,并增加空指针防护:
public class MainActivity extends BaseActivity implements ISignaller { SignallerService ss = new SignallerService(this); private ISignaller2 publisher; // 补充变量声明 public void start() { ss.start(); } public void setPublisher(ISignaller2 publisher) { this.publisher = publisher; } @Override public void onPublishMessage(String message) { if (publisher != null) { // 避免空指针异常 publisher.onPublishMessage(message); } } }
内容的提问来源于stack exchange,提问作者Ibanez1408
相关产品推荐
相关产品推荐

