当前我遇到了一个问题,我想从数据库中获取字符串并将字符串返回到我的视图中。我使用的框架是MVP和Rxjava。在下面的代码中详细解释:
fragment.java
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
//get a string output from database by calling presenter attached with this view (fragment)
String textFromDb = presenter.getLanguage(id);
}
Presenter.java
public String getLanguage(String id) {
mLanguagePackDataManager.getLanguage(id)
.subscribeOn(mDataManager.getScheduler())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(String languageLabel) {
// >>> I need to pass this "languageLabel" to the fragment but I can't return anything from here <<<
}
});
}
所以我的问题是,如何通过&#34; languageLabel&#34;分段,以便在片段中我可以使用&#34; textFromDb&#34;做一些事情,例如:将此字符串设置为textview。我知道我可以在View接口中创建一个方法,如updateLabel(String text)
,其中片段将实现此方法。所以我调用getView().updateLabel(languageLabel)
,片段实现将找到textView并相应地设置文本。这是传递信息的唯一方法吗?
任何帮助都将非常感激。
答案 0 :(得分:0)
这不是唯一的方法,但在我看来是正确的。理想情况下,应用程序的不同层应使用interfaces
在它们之间进行交谈 - 它为您提供了最大的灵活性。这样,分别测试每个层非常容易,例如,在presenter
图层中,您只需验证是否正确调用了view.updateLabel(languageLabel)
文字。
回到你的问题 - 还有其他方法可以达到这个目标(我的想法是使用一些EventBus
,但我只是坚持interfaces
答案 1 :(得分:0)
演示者应该:
private viewInterface view; // reference to view
public Presenter(viewInterface view) { //constructor for such view
this.view = view;
}
然后在onNext中,您应该指向查看方法
@Override
public void onNext(String languageLabel) {
view.updateLabel(languageLabel)
}
从观点角度
//create object via Interface with connection to current view
PresenterInterface interface = new Presenter(this);
//call subscriber method from Presenter interface
presenterInterface.getLanguage(id);