实现同一个侦听器的多个活动

时间:2018-06-25 10:40:05

标签: java android architecture mvp

我知道也有类似的问题,但是仍然不能以我目前的情况来回答我的问题。

我有三个活动演示者,每个活动演示者都需要远程调用某个数据,因此,它们将在数据到达时回调活动演示者。为了创建此数据侦听器,我创建了一个接口侦听器,由于所有三个Presenter都要求相同的数据并进行检索,因此所有三个Presenter都实现了此接口侦听器。

接口侦听器:

forEach

演示者一:

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
    }
}

假设演示者3与上一个完全相同。数据管理器类:

class PresenterTwo implements ListenerInterface{

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

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

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

抱歉,这个问题对某些人来说很简单,但我仍在学习中。

非常感谢您。

1 个答案:

答案 0 :(得分: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()));
        }

    });
}
}

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