如何将字符串从Subscriber onNext()传递给View?

时间:2016-04-21 09:33:48

标签: android rx-java mvp observable

当前我遇到了一个问题,我想从数据库中获取字符串并将字符串返回到我的视图中。我使用的框架是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并相应地设置文本。这是传递信息的唯一方法吗?

任何帮助都将非常感激。

2 个答案:

答案 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);