尝试通过改造从Web服务获取数据时出错

时间:2017-06-02 00:22:41

标签: android web-services retrofit2

我有一个应用程序,有时会被粉碎,它从来没有发生在我身上,一些用户报告了它...这是谷歌发送给我的堆栈跟踪:

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

任何想法?

2 个答案:

答案 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()));
}