为什么在从ViewModel进行调用时,Retrofit不会排队工作?

时间:2018-06-16 09:22:11

标签: java android kotlin retrofit2 android-lifecycle

我构建了MVVM并通过Retrofit 2从Network获取数据。获取数据流如下所示:MainActivity - > ViewModel - >存储库 - > APiService。所以,我从存储库中调用enqueu,如下所示:

  public List<Result> getArticles() {
        final List<Result>[] articles = new List[]{new ArrayList<>()};
        Log.d(TAG, "getArticles");
        ApiService.getService().getArticles("test", "thumbnail").enqueue(new Callback<Example>() {
            @Override
            public void onResponse(Call<Example> call, Response<Example> response) {
                Log.d(TAG, "onResponse");
                if (response.isSuccessful()) {
                    Log.d(TAG, "isSuccessful");
                    articles[0] = response.body().getResponse().getResults();   
                }
            }

            @Override
            public void onFailure(Call<Example> call, Throwable t) {
                Log.d(TAG, "onFailure");
            }
        });
        return articles[0];
    }

我从我的ViewModel调用getArticles就像这样:

public List<Result> getArticleList() {
    Log.d(TAG, "getArticleList");
    articleRepository = new ArticleRepository();
    articleRepository.getArticles();
    return articleList;
}

然而,我的入队不起作用,我花了几个小时才弄明白为什么,仍然不能。我唯一注意到的是,当我打电话时不是来自ViewModel,而是来自MainActivity,enqueue确实有效! 谁能说出我在这里失踪了什么?为什么同样的事情不适用于ViewModel?我认为有一些线程或lyfecycle问题,但无法弄清楚究竟是什么。

另外,注意到在获取数据时我尝试在MainActivity中打印,但它不起作用:

 for (Result article : articleList) {
            Log.d(TAG, article.getSectionName());
        }

但是,当我从改装排队onResponse回调打印它确实有效。这有什么问题?

1 个答案:

答案 0 :(得分:2)

尝试更改ViewModel以返回articleRepository.getArticles()

public List<Result> getArticleList() {
    Log.d(TAG, "getArticleList");
    articleRepository = new ArticleRepository();
    return articleRepository.getArticles();
}