2017-03-09 69 views
0

我在尋找更好的方法來做到這一點:機器人 - 併發API調用

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管理器中創建一個進程,我正在考慮使用隊列系統,但我不確定是否可以,因爲我需要來自父節點的結果。

我一直在這裏旋轉我的輪子幾天。

回答

0

我可能會保留你正在請求的總項目的變量以及到目前爲止收到的響應數量。一旦successResponses == totalItems你可以觸發callback.success(菜單)。當然,它有點複雜,因爲你有兩層多個對象要檢索。

請確保您同步對計數器變量的訪問,因爲您可能正在不同線程中接收您的APICallbacks。

0

通過使用我的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; 
      } 
     } 

    }