我知道也有类似的问题,但是仍然不能以我目前的情况来回答我的问题。
我有三个活动演示者,每个活动演示者都需要远程调用某个数据,因此,它们将在数据到达时回调活动演示者。为了创建此数据侦听器,我创建了一个接口侦听器,由于所有三个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框架的任何人都可以提供详细的答案,那么我可以从中学到更多,那就太好了。 我要这样做的原因是我想通过类之间的接口进行通信。
抱歉,这个问题对某些人来说很简单,但我仍在学习中。
非常感谢您。
答案 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()));
}
});
}
}
您可以根据需要创建事件类结构。