美好的一天,我第一次使用Retrofit而且我似乎无法让它工作。致力于以当地货币获得加密货币汇率的应用程序,这里是api link,JSON格式
{
"BTC": {
"USD": 6019.1,
"EUR": 5139.44,
"NGN": 2136243.25
},
"ETH": {
"USD": 290.98,
"EUR": 250.03,
"NGN": 103031.01
}
}
以下是我的模型(来自http://www.jsonschema2pojo.org/):更新
public class CryptoCurrency {
@SerializedName("BTC")
@Expose
private BTC BTC;
@SerializedName("ETH")
@Expose
private ETH ETH;
public BTC getBTC() {
return BTC;
}
public void setBTC(BTC BTC) {
this.BTC = BTC;
}
public ETH getETH() {
return ETH;
}
public void setETH(ETH ETH) {
this.ETH = ETH;
}
public class BTC {
@SerializedName("USD")
@Expose
private Double USD;
@SerializedName("EUR")
@Expose
private Double EUR;
@SerializedName("NGN")
@Expose
private Double NGN;
public Double getUSD() {
return USD;
}
public void setUSD(Double USD) {
this.USD = USD;
}
public Double getEUR() {
return EUR;
}
public void setEUR(Double EUR) {
this.EUR = EUR;
}
public Double getNGN() {
return NGN;
}
public void setNGN(Double NGN) {
this.NGN = NGN;
}
}
public class ETH {
@SerializedName("USD")
@Expose
private Double USD;
@SerializedName("EUR")
@Expose
private Double EUR;
@SerializedName("NGN")
@Expose
private Double NGN;
public Double getUSD() {
return USD;
}
public void setUSD(Double USD) {
this.USD = USD;
}
public Double getEUR() {
return EUR;
}
public void setEUR(Double EUR) {
this.EUR = EUR;
}
public Double getNGN() {
return NGN;
}
public void setNGN(Double NGN) {
this.NGN = NGN;
}
}
}
我的界面:
public interface CurrencyInterface {
@GET("/data/pricemulti/")
Call<CryptoCurrency.BTC> currency(@Query("crypto") String crypto, @Query("local") String local);
}
我的onResponse
方法:
call.enqueue(new Callback<CryptoCurrency.BTC>() {
@Override
public void onResponse(Call<CryptoCurrency.BTC> call, Response<CryptoCurrency.BTC> response) {
String currency = response.body().toString();
Toast.makeText(getApplicationContext(), "result " + currency, Toast.LENGTH_LONG).show();
Log.i("MainActivity", currency);
}
@Override
public void onFailure(Call<CryptoCurrency.BTC> call, Throwable t) {
}
});
当我运行代码并检查我的日志时,我收到此错误:
java.lang.NullPointerException
at com.example.raynold.cryptorates.MainActivity$1.onResponse(MainActivity.java:53)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
修订---------
我的MainActivity类
public class MainActivity extends AppCompatActivity {
private RecyclerView mCurrencyRecycler;
private Button mclickMe;
private CurrencyAdapter mCurrencyAdapter;
private List<CryptoCurrency> mCurrencyList;
private CurrencyInterface mCurrencyInterface;
private LinearLayoutManager mLinearLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCurrencyRecycler = (RecyclerView) findViewById(R.id.rv_rates);
mLinearLayoutManager = new LinearLayoutManager(this);
mCurrencyRecycler.setLayoutManager(mLinearLayoutManager);
mCurrencyRecycler.setHasFixedSize(true);
mclickMe = (Button) findViewById(R.id.click_me);
mCurrencyInterface = ApiClient.getApiClient().create(CurrencyInterface.class);
Call<CryptoCurrency.BTC> call = mCurrencyInterface.currency("BTC", "NGN");
call.enqueue(new Callback<CryptoCurrency.BTC>() {
@Override
public void onResponse(Call<CryptoCurrency.BTC> call, Response<CryptoCurrency.BTC> response) {
String currency = response.body().toString();
Toast.makeText(getApplicationContext(), "result " + currency, Toast.LENGTH_LONG).show();
Log.i("MainActivity", currency);
}
@Override
public void onFailure(Call<CryptoCurrency.BTC> call, Throwable t) {
}
});
mclickMe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
我还想知道如何使用recyclelerview来使用它,因为JSON是对象类型而不是数组。
答案 0 :(得分:0)
像这样更改onResponse
方法:
...........
call.enqueue(new Callback<CryptoCurrency.BTC>() {
@Override
public void onResponse(Call<CryptoCurrency.BTC> call, Response<CryptoCurrency.BTC> response) {
String currency = response.getUSD().toString();
Toast.makeText(getApplicationContext(), "result " + currency, Toast.LENGTH_LONG).show();
Log.i("MainActivity", currency);
}
@Override
public void onFailure(Call<CryptoCurrency.BTC> call, Throwable t) {
}
});
试试这个解决你的问题。
答案 1 :(得分:0)
您不应在网址的开头和结尾使用反斜杠。
尝试
@GET("data/pricemulti")
而不是
@GET("/data/pricemulti/")
答案 2 :(得分:0)
public class CryptoCurrency {
@SerializedName("BTC")
@Expose
private BTC BTC;
@SerializedName("ETH")
@Expose
private ETH ETH;
public BTC getBTC() {
return BTC;
}
public void setBTC(BTC BTC) {
this.BTC = BTC;
}
public ETH getETH() {
return ETH;
}
public void setETH(ETH ETH) {
this.ETH = ETH;
}
class ETH {
...
}
class BTC {
...
}
}
在您的界面CurrencyInterface
中使用
@GET("/data/pricemulti")
Call<CryptoCurrency> currency(@Query("fsyms") String crypto, @Query("tsyms") String local);
处理
Call<CryptoCurrency> call = mCurrencyInterface.currency("BTC", "NGN");
call.enqueue(new Callback<CryptoCurrency>() {
@Override
public void onResponse(Call<CryptoCurrency> call, Response<CryptoCurrency> response) {
BTC btc = response.body().getBTC();
Toast.makeText(getApplicationContext(), "result " + btc.getNGN(), Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(Call<CryptoCurrency.BTC> call, Throwable t) {
}
});
答案 3 :(得分:0)
检查此行之前的response.body()是否为空
String currency = response.body().toString();
如果响应代码不等于200,则您的响应将为空