【问题标题】:How to make multiple calls with Retrofit?如何使用 Retrofit 拨打多个电话?
【发布时间】:2020-01-23 16:21:44
【问题描述】:

我需要使用 Retrofit 多次调用 API REST 并在 ListView 中显示响应,但我不知道如何执行此操作,并且此代码不起作用。

型号

@GET("apks/{sha256}")
    Call<DatoAPI> getTask2(@Path("sha256") String hash, @Query("Authorization") String key);

实施

for (String s: hash) {                                          
    Call<DatoAPI> call = services.getTask2(s, API.API_KEY);
    call.enqueue(new Callback<DatoAPI>() {
        @Override
        public void onResponse(Call<DatoAPI> call, Response<DatoAPI> response) {
            if (response.isSuccessful()) {
                datoAPI = response.body();
                items.add(datoAPI.getApp());
            }
        }

        @Override
        public void onFailure(Call<DatoAPI> call, Throwable t) {
            Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_LONG).show();
        }
    });
}

我也试过call.execute() 和同样的问题 我想在ListView 中显示此响应,但它不起作用。

【问题讨论】:

  • 使用Rxjava提供的zip算子进行并行调用

标签: android retrofit2


【解决方案1】:

首先你需要了解 Retrofit 的 Call#enqueue()Call#execute() 方法之间的区别。

  1. enqueue() 方法是异步的,这意味着您可以在另一个任务完成之前继续它

  2. execute() 方法是同步的,这意味着,在继续执行其他任务之前,您需要等待它完成。

在您的情况下,您正在使用for 循环一次执行多个请求。

现在,如果你使用 for 循环执行网络操作,网络操作不会停止 for 循环进入下一次迭代。不要期望 API 会总是在进入 for 循环下一次迭代之前以足够快的方式响应。这是个坏主意。

如果您使用 Retrofit 的 execute() 方法,它将不允许您继续下一行(或迭代)作为其同步行为,并且它会抛出 NetworkOnMainThreadExceptionIOException。因此,您需要将请求包装在 AsyncTask 中并处理 IOException

我建议您将RxAndroidRxJava 一起使用,而不是使用for 循环。有很多关于这个主题的教程。

请参阅以下 StackOverflow 问题来解决您的问题。

  1. How to make multiple request and wait until data is come from all the requests in Retrofit 2.0 - Android?
  2. Asynchronous vs synchronous execution, what does it really mean?

根据您的要求调整代码。

祝你好运!

【讨论】:

  • 我是 API 休息消费的新手,我不明白 StackOverflow 的问题,你能帮我解决吗?
  • 如果你是新手,现在不要去追求高级的东西。先学基本的东西。开始学习基本 API 请求的工作原理,而不是从多个请求开始。首先了解核心功能。我不是不鼓励你不学习高级的东西,我也不是强迫你参考 SO 问题。当你用谷歌搜索东西时,你会得到大量的结果。这就是我们学习和学习更多新技术的方式。请记住,SO 不是讨论论坛。开始学习,(重新)搜索它。如果您没有找到错误的解决方案,请在此处提出新问题,社区用户帮助您
  • 我只是API rest的新手,我学习了一个简单的请求和改造,我只需要知道如何发出多个请求。
  • 无论您尝试什么都不是一个好习惯(使用 for 循环)。我强烈推荐 RXJava2 和 RXAndroid。由于这些技术使您的需求实现路径变得更加容易。那里有很多教程。要学习 RxJava 的基础知识,请从 AndroidHive 开始。祝你好运!
  • 非常感谢,我准备在AndroidHive中搜索。
猜你喜欢
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
相关资源
最近更新 更多