【问题标题】:android - concurrent api callsandroid - 并发 api 调用
【发布时间】:2017-07-31 02:07:19
【问题描述】:

我正在寻找一种更好的方法来做到这一点:

APIManager.getInstance().processRequest(baseRequest, new Callback() {
  @Override
  public void onFailure(Call call, IOException e) {
      callback.failure(new Error(null, 400));
  }

  @Override
  public void onResponse(final Call call, Response response) throws IOException {
      String stringJson = response.body().string();
      try {
          JSONObject menuObject = new JSONObject(stringJson);

          final Menu menu = new Menu();
          if (!menuObject.isNull("category")) {

              final JSONArray categoriesArray = menuObject.getJSONArray("category");

              for (int i = 0; i < categoriesArray.length(); i++) {
                  final JSONObject category = categoriesArray.getJSONObject(i);
                  final MenuCategory menuCategory = new MenuCategory(category);
                  menu.getCategories().add(menuCategory);
                  getCategoryProductsRequest(storeId, menuCategory.getId(), priceType, new APICallback<ArrayList<MenuItem>>() {
                      @Override
                      public void success(final ArrayList<MenuItem> responseItems) {
                          for (final MenuItem menuItem : responseItems) {
                              getProductDetailsRequest(storeId, menuItem.getProductID(), priceType, new APICallback<ArrayList<MenuConfiguration>>() {
                                  @Override
                                  public void success(ArrayList<MenuConfiguration> response) {
                                      menuItem.setConfigurations(response);
                                      menuCategory.setItems(responseItems);
                                  }

                                  @Override
                                  public void failure(Error error) {
                                  }
                              });
                          }
                      }

                      @Override
                      public void failure(Error error) {
                      }
                  });
              }

              new Timer().schedule(new TimerTask() {
                  @Override
                  public void run() {
                      // this code will be executed after 2 seconds
                      callback.success(menu);
                  }
              }, 5000);
          }
      } catch (JSONException e) {
          callback.failure(new Error(null, 400));
          e.printStackTrace();
      }


  }

我想删除计时器延迟并在所有端点完成后发送回调。每个函数只是在我的 API 管理器中创建一个进程,我正在考虑使用队列系统,但我不确定是否可以,因为我需要来自父端点的结果。

这几天我一直在旋转我的轮子。

【问题讨论】:

    标签: android api callback okhttp3


    【解决方案1】:

    我可能会为您请求的总项目和到目前为止收到的回复数量保留变量。一旦successfulResponses == totalItems 你可以触发callback.success(menu)。当然它有点复杂,因为你有两个级别的多个对象要检索。

    确保同步对计数器变量的访问,因为您可能在不同的线程中接收 APICallback。

    【讨论】:

      【解决方案2】:

      通过使用我的 APIManager 中的计数器解决了这个问题。

          private APIManager() {
      
              int cacheSize = 10 * 1024 * 1024;
              this.client = new OkHttpClient.Builder()
                      .addInterceptor(new HttpLoggingInterceptor())
                      .addInterceptor(new BaseInterceptor())
                      .build();
          }
      
          public void processRequest(BaseRequest request, final Callback callback)
          {
      
              counter++;
              Callback tempCallback = new Callback() {
                  @Override
                  public void onFailure(Call call, IOException e) {
                      decrementCounter();
                      callback.onFailure(call, e);
                  }
      
                  @Override
                  public void onResponse(Call call, Response response) throws IOException {
                      decrementCounter();
                      callback.onResponse(call, response);
                  }
              };
      
              client.newCall(request.getRequest()).enqueue(tempCallback);
          }
      
          private void decrementCounter() {
              counter--;
              if (counter <= 0) {
                  counter = 0;
      
                  if (listener != null) {
                      listener.onAllCallsCompleted();
                      listener = null;
                  }
              }
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 2023-03-14
        • 2021-11-13
        相关资源
        最近更新 更多