Android——你可能不知道的Debug细节
16lz
2022-06-01
Android——你可能不知道的Debug细节
近期在使用Android Studio对程序进行Debug时,发现了一个之前自己一直忽视或者说不了解的一个细节,特此记录下来分享给大家。
开发中,我对以下一段代码进行了调试:
call.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { try { if (response.isSuccessful()) { String result = response.body().string(); Gson gson = new Gson(); VehicleEntity vehicleEntity = gson.fromJson(result, VehicleEntity.class); if (vehicleEntity == null) { callBack.onNoData(); } else { callBack.onSuccess(vehicleEntity); } } else { callBack.onFailure(); } } catch (Exception e) { e.printStackTrace(); callBack.onFailure(); } } @Override public void onFailure(Call call, Throwable t) { callBack.onFailure(); } });
如上述代码,是关于一个网络请求的过程,然后我在debugger视图中把result添加到watcher:
结果debug过程中result一直为一个空的字符串,而我如果不debug直接运行程序,则一切正常,当时我以为这是什么奇怪的bug,百思不得其解。
后来多方询问终于找出了发生此现象的原因。大家可以看到我在watcher里面输出的其实是一个语句,reslut=response.body.string()
。而watcher里的语句,会在你的debug触发第一个断点时,就会尝试执行,也就是说,在我这个程序遇到第一个断点时,“reslut=response.body.string()”这个语句就已经尝试执行了。而巧就巧在okhttp的response.body.string()方法只能有效调用一次,所以当debug真正执行到这一句的时候,get到的string就已经是空值了,并不是什么bug。
所以大家在调试程序的时候,打印变量的方式以及断点的位置都要有所注意和讲究,不要在这上面白白耽误了自己的时间~
更多相关文章
- [Android] AsyncTask使用实例---加载网络图片
- Android之Touch事件分发机制
- android百度地图 SDK v3.5.0
- android字体闪烁动画(线程)
- Android教程之SQlit数据库操作
- Android(安卓)自定义布局对话框避免全屏的设置
- android程序执行adb shell命令
- android View根据自己获取焦点的情况执行语句
- Android(安卓)NDK编译时出现的问题以及解决办法