簡體   English   中英

如果我在一個請求中得到四個pojo,如何改寫代碼以進行改造?

[英]How to rerite code to retrofit, if i get four pojo in one request?

我有休息的api請求:api.coinmarketcap.com/v2/ticker/?convert=EUR如您所見,這里有一個方法“ convert = EUR”(不能再添加一個)。 我在一個asyncTask中發出4個請求,並用gson創建pojo(我知道是不好的做法):

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;
    }

我這樣做是為了在內存中存儲幾次轉換。 我該如何使用Retrofit? 如何做得更優雅?

定義您的基本網址:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM