我有一个应用程序,有时会被粉碎,它从来没有发生在我身上,一些用户报告了它...这是谷歌发送给我的堆栈跟踪:
java.lang.NullPointerException:
at com.mal.saul.preciosbitcoinmexico.Fragment.FragmentPrincipal.
realizarCambioPrecio(FragmentPrincipal.java:181)
at com.mal.saul.preciosbitcoinmexico.Fragment.FragmentPrincipal.
access$200(FragmentPrincipal.java:42)
at com.mal.saul.preciosbitcoinmexico.Fragment.FragmentPrincipal$2.
onResponse(FragmentPrincipal.java:160)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.
run(ExecutorCallAdapterFactory.java:68)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5637)
at java.lang.reflect.Method.invoke(Native Method:0)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.
run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
我认为我的错误在onResponse方法上,在这里是:
@Override
public void onResponse(Call<BtcValuesResponse> call,
Response<BtcValuesResponse> response) {
BtcValuesResponse btcValuesResponse =
response.body();
if(btcValuesResponse != null){
btcValues =
btcValuesResponse.getBtcValues();
showBtcValues();
}
else {
Toast.makeText(getActivity(), "Bitso No Está Disponible Por
el Momento", Toast.LENGTH_SHORT).show();
}
}
任何想法?
答案 0 :(得分:0)
您正在通过Retrofit异步请求数据,请求完成后,您可以通过调用showBtcValues()
来显示数据。
如果您的请求尚未完成但用户更改为其他屏幕。所以,当它完成时,它仍然会调用showBtcValues
,然后你会崩溃,因为那里没有UI组件。
请尝试重新创建崩溃。我认为这是问题所在。
如果是,解决方案是您应该检查您调用请求的Fragment(或Activity)的状态。
答案 1 :(得分:0)
如前所述,也许您的there is no UI component there
或
您只是假设响应Response<BtcValuesResponse> response
是有效的,但是您应该检查API响应是否没有速率限制,或者是否由于连接错误,该响应是无效的随机数或其他。您需要先验证响应状态,然后再对其进行包装。
if(response.isSuccessful()){
// Get the body, where the BTCValueResponse is
BtcValuesResponse responseBody = response.body();
btcValuesResponse.getBtcValues();
showBtcValues();
}else{
// Check the error stream
System.out.println(Utils.inputStreamToString(wrappedServiceResponse.errorBody().byteStream()));
}