【问题标题】:Why doesn't Retrofit enqueue work when making a call from ViewModel?为什么从 ViewModel 进行调用时,Retrofit enqueue 不起作用?
【发布时间】:2018-06-16 09:22:10
【问题描述】:

我通过 Retrofit 2 构建了 MVVM 并从 Network 获取数据。获取数据流是这样的:MainActivity -> ViewModel -> Repository -> 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 进行调用时,入队确实有效!!! 谁能告诉我我在这里想念什么?为什么同样的事情在 ViewModel 中不起作用?我认为存在一些线程或生命周期问题,但无法弄清楚究竟是什么。

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

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

但是当我从改造入队 onResponse 回调中打印它时,它确实有效。这里有什么问题?

【问题讨论】:

  • 对不起,我的错,原因是小代码错误。我宁愿自己投反对票:D 但是,仍然没有从 MainActivity 记录该列表。

标签: java android kotlin retrofit2 android-lifecycle


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,后来发问题的时候找到了
  • 你知道为什么没有从 MainActivity 中记录列表吗,这很令人担忧
  • 您的 Retrofit 调用是异步的。您必须对您的活动使用回调才能在 UI 中获得结果。可能是帮助stackoverflow.com/questions/41160019/…
  • 谢谢!明白了,我在 OnResponse 中调用了 setValue 并在 LiveData onChanged 回调中进行了 ui 更改
猜你喜欢
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
相关资源
最近更新 更多