【问题标题】:Multiple Activities Implementing Same Listener实现相同侦听器的多个活动
【发布时间】:2018-12-03 21:57:01
【问题描述】:

我知道有类似的问题,但它仍然不能以我当前情况所需的方式回答我的问题。

我有三个活动演示者,每个都需要远程调用某个数据,因此当数据到达时会回调活动演示者。为了创建这个数据监听器,我创建了一个接口监听器,因为所有三个 Presenter 都请求相同的数据并检索它,所以三个 Presenter 都实现了这个接口监听器。

接口监听器:

interface ListenerInterface {

     onGotData();

}

演讲者一:

class PresenterOne implements ListenerInterface{

    public void getData() {
        DataManager dataManager = new DataManager();
        dataManager.getData(this);
    }

    @Override
    public void onGotData(Data data) {
        //Do something with data
    }
}

演示者二与演示者一非常相似:

class PresenterTwo implements ListenerInterface{

    public void getData() {
        DataManager dataManager = new DataManager();
        dataManager.getData(this);
    }

    @Override
    public void onGotData(Data data) {
        //Do something with data
    }
}

假设 Presenter 3 和前面的完全一样。数据管理器类:

class DataManager {

    public void getData(final ListenerInterface listener) {

        //Gets data
        addOnCompleteListener(new OnCompleteListener<Data data > () {
            @Override
            public void onComplete (@NonNull DataCall < Data > dataCall) {
                listener.onGotData(dataCall.getResults());
            }

        });
    }
}

是否有人会调用所有三个演示者,因为接口是执行调用的接口,还是只调用传递的演示者?如果我遵循这种方式,我有什么需要担心的吗?如果任何熟悉 Android 框架的人都可以提供详细的答案,以便我可以从中学到更多东西,那就太好了。 我想这样做的原因是我想通过类之间的接口进行通信。

对不起,如果这个问题对某些人来说很简单,但我仍在学习。

非常感谢您。

【问题讨论】:

  • 您好,希望您每天都能学到更多,成为一名专业人士。别担心,该行业的每个人每天都会学到一些东西。也许你可以看看here 来看看如何在类之间使用接口的一个小例子。如果你不明白这一点,我会尽力给你一个不同的例子。
  • 感谢您的积极。该示例确实对您有所帮助,该示例回答了只有在参数中传递的类才会被调用的问题,但是如果有人阅读此内容可以确认,那就太好了。谢谢艾哈迈德!
  • 您不必将界面视为对象。接口永远不是做调用的那个。它始终是您的主持人。接口只是告诉“这个对象尊重这个规范”的一种方式,规范由接口定义。因此,当 DataManger 调用 listener.onGotData() 时,它总是在给定对象(给定演示者)上调用此方法。所以只会触发一个
  • 好的,我明白了,非常感谢@vincrichaud。
  • 嘿@vincrichaud 我知道已经有一段时间了,但是添加您的评论作为答案,我会将其标记为答案

标签: java android architecture mvp


【解决方案1】:

您可以使用 RxBus 实现来制作全局事件(例如您的 onGotData)。 首先你必须创建 RxBus 类。

public class RxBus {
private static RxBus instance;
private PublishSubject<Event> subject = PublishSubject.create();

public static synchronized RxBus getInstance() {
    if (instance == null) {
        instance = new RxBus();
    }

    return instance;
}

private RxBus(){}

public void postEvent(Event event){
    subject.onNext(event);
}

public Observable<Event> getEvents(){
    return subject;
}

}

现在,您应该在 BaseActivity 或类似的东西中订阅它(取决于您的项目结构)。

private RxBus rxbus;
private Subscription rxBusSubscription;

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        rxBus = RxBus.getInstance();
    }

@Override
protected void onResume() {
    super.onResume();

    if (shouldSubscribeRxBus()) {
        rxBusSubscription = rxBus.getEvents()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(event -> {
                    if (event.getEventType() == Event.EventType.DATA_RECEIVED) {
                        onGotData(data);
                    }
                });
    }
}

现在根据需要实现 onGotData。

当你捕捉到数据接收调用时:

class DataManager {

public void getData(final ListenerInterface listener) {

    //Gets data
    addOnCompleteListener(new OnCompleteListener<Data data > () {
        @Override
        public void onComplete (@NonNull DataCall < Data > dataCall) {
            RxBus.getInstance().postEvent(new GotDataEvent(dataCall.getResults()));
        }

    });
}
}

您可以根据需要创建事件类结构。

【讨论】:

  • 嗨@Ikazuchi,非常感谢您的回答。对于我正在尝试做的事情,这是一个非常有趣的解决方案,它有助于学习以备将来使用,但它并没有像评论员上面回答的那样回答我关于使用接口的效果的直接问题。我会给你一个赞成票,这个答案确实会考虑不同的解决方案,当我的声誉超过 15 分时,我的赞成票将生效。谢谢 :)
猜你喜欢
  • 1970-01-01
  • 2018-08-26
  • 2018-11-29
  • 2014-12-02
  • 2015-10-07
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多