代码之家  ›  专栏  ›  技术社区  ›  Iliya Mashin

如果我在一个请求中得到四个pojo,如何重新编写代码进行改造?

  •  0
  • Iliya Mashin  · 技术社区  · 6 年前

    我有RESTAPI请求:api.coinmarketcap.com/v2/ticker/?convert=EUR

    public Currencies fetchItems(int capacity){
            List<Currency> currencyList;
    
            Uri.Builder uriBuilder = ENDPOINT.buildUpon().appendQueryParameter("limit","" + capacity);
            String uriUsd = uriBuilder.build().toString();
            String uriBtc = uriBuilder.appendQueryParameter("convert", "BTC").build().toString();
            uriBuilder = ENDPOINT.buildUpon().appendQueryParameter("limit","" + capacity);
            String uriRub = uriBuilder.appendQueryParameter("convert", "RUB").build().toString();
            uriBuilder = ENDPOINT.buildUpon().appendQueryParameter("limit","" + capacity);
            String uriEur = uriBuilder.appendQueryParameter("convert", "EUR").build().toString();
            try {
                String jsonString = getUrlString(uriUsd);
                String jsonStringBtc = getUrlString(uriBtc);
                String jsonStringRub = getUrlString(uriRub);
                String jsonStringEur = getUrlString(uriEur);
                Currencies currencies = deserializationCryptoRequest(jsonString);
                Currencies btc = deserializationCryptoRequest(jsonStringBtc);
                Currencies rub = deserializationCryptoRequest(jsonStringRub);
                Currencies eur = deserializationCryptoRequest(jsonStringEur);
                currencyList = new ArrayList<>(currencies.getData().values());
                List<Currency> btcList = new ArrayList<>(btc.getData().values());
                List<Currency> rubList = new ArrayList<>(rub.getData().values());
                List<Currency> eurList = new ArrayList<>(eur.getData().values());
    
                for(int i = 0; i < currencyList.size(); i++){
                    Currency item = currencyList.get(i);
                    Currency btcItem = btcList.get(i);
                    Currency rubItem = rubList.get(i);
                    Currency eurItem = eurList.get(i);
                    String bitmapPath = IconsManager.getIconsLinks().get(item.getSymbol());
                    item.setIconBitmap(downloadBitmap(bitmapPath));
                    item.addQoute("BTC", btcItem.getQuotes().get("BTC"));
                    item.addQoute("RUB", rubItem.getQuotes().get("RUB"));
                    item.addQoute("EUR", eurItem.getQuotes().get("EUR"));
                }
                 return currencies;
            } catch (IOException ioe){
                Log.e(TAG, "Cannot get response from api: " + ioe);
            }
            return null;
        }
    

    我这样做是为了在内存中存储几个转换。如何进行改装?如何做得更优雅?

    1 回复  |  直到 6 年前
        1
  •  1
  •   DennisVA    6 年前

    定义基本URL:

    public class Constants {
        public static final String BASE_URL = "https://api.coinmarketcap.com/v2/";
    }
    

    import io.reactivex.Single;
    import retrofit2.http.GET;
    import retrofit2.http.Path;
    
    public interface CoinMarketClient {
    @GET("listings")
    Single<CoinMarketListingsReponse> getListings();
    
    @GET("ticker/{id}")
    Single<CoinMarketCurrencyResponse> getCurrency(@Path("id") int id);
    
    @GET("ticker/{id}/?convert={fiat}")
    Single<CoinMarketCurrencyResponse> getCurrency(@Path("id") int id, 
    @Path("fiat") String fiatCode);
    }
    

    public enum FiatCode {
    AUD,
    BRL,
    CAD,
    CHF,
    CLP,
    CNY,
    CZK,
    DKK,
    EUR,
    GBP,
    HKD,
    HUF,
    IDR,
    ILS,
    INR,
    JPY,
    KRW,
    MXN,
    MYR,
    NOK,
    NZD,
    PHP,
    PKR,
    PLN,
    RUB,
    SEK,
    SGD,
    THB,
    TRY,
    TWD,
    USD,
    ZAR
    }
    

    初始化改装材料:

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new 
        OkHttpClient.Builder().addInterceptor(interceptor).build();
    
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Quotes.class, new QuotesDeserializer())
                .create();
    
        Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .client(client)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson));
    
        Retrofit retrofit = builder.build();
    
        coinMarketClient = retrofit.create(CoinMarketClient.class);