前言

对app的线上bug的收集(友盟、云捕等)有时会得到这样的异常堆栈信息:没有一行代码是有关自身程序代码的。这使得对bug的解决无从下手,根据经验,内存不足OOM,Dialog关闭,ListView等相关代码很容易引起这类错误。下面总结下BaseAdapter.getView崩溃bug,然后给出如何编写代码来方便以后对它的定位。

BaseAdapter.getView

如果getView方法返回null,那么对应的ListView在显示时就直接触发NullPointerException异常。但是无论是哪个界面的哪个ListView发生了这个错误,对应的异常信息总是这样的:

E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.example.hxw.myapplication, PID: 1662java.lang.NullPointerExceptionat android.widget.AbsListView.obtainView(AbsListView.java:2274)at android.widget.ListView.makeAndAddView(ListView.java:1790)at android.widget.ListView.fillDown(ListView.java:691)at android.widget.ListView.fillFromTop(ListView.java:752)at android.widget.ListView.layoutChildren(ListView.java:1630)at android.widget.AbsListView.onLayout(AbsListView.java:2087)at android.view.View.layout(View.java:14817)at android.view.ViewGroup.layout(ViewGroup.java:4631)at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)at android.view.View.layout(View.java:14817)at android.view.ViewGroup.layout(ViewGroup.java:4631)at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)at android.widget.FrameLayout.onLayout(FrameLayout.java:388)at android.view.View.layout(View.java:14817)at android.view.ViewGroup.layout(ViewGroup.java:4631)at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)at android.view.View.layout(View.java:14817)at android.view.ViewGroup.layout(ViewGroup.java:4631)at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)at android.widget.FrameLayout.onLayout(FrameLayout.java:388)at android.view.View.layout(View.java:14817)at android.view.ViewGroup.layout(ViewGroup.java:4631)at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1983)at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1740)at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)at android.view.Choreographer.doCallbacks(Choreographer.java:574)at android.view.Choreographer.doFrame(Choreographer.java:544)at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)at android.os.Handler.handleCallback(Handler.java:733)at android.os.Handler.dispatchMessage(Handler.java:95)at android.os.Looper.loop(Looper.java:136)at android.app.ActivityThread.main(ActivityThread.java:5001)at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke(Method.java:515)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)at dalvik.system.NativeStart.main(Native Method)

可以看到,整个异常信息提供的堆栈是不含任何与自己代码相关的调用信息的。
实际上,错误是因为getView返回null引起的,但是从上面的信息无法定位到到底哪个Adapter发生问题。
如果可以收集到用户是在哪个页面发生崩溃那么问题的定位会准确许多,但是,如果自己的Adapter需要返回好多种View(也就是getViewTypeCount的值,比如一个包含很多不同布局的对话列表),那么你还是需要仔细分析代码来找到具体哪个View的生成逻辑出了问题。

更多时候,除了得到以上的错误堆栈,对于真正的bug再无更多信息。实际上是无法判断出具体出问题的Adapter的。解决办法只能从根源上进行:
在我们编写getView方法时,对最终返回的参数自己进行非空判断,当针对不同position处的getItemViewType得到的View对象为null时,可以自己抛出一个NullPointerException,而不是等getView的调用者(框架API)来抛出上面给出的“没用”的信息。
也可以针对null的情况返回一个有用的信息给用户,而不是让程序崩溃。

// 在自己的Adapter子类中@Override
public View getView(int position, View convertView, ViewGroup parent) {return buildView(position, convertView, parent);
}private View buildView(int position, View convertView, ViewGroup parent) {// ... 这里是根据getItemViewType生成不同View的逻辑,将View对象存储在convertViewif (convertView == null) {// throw 一个Exception,包含position,getItemViewType的数据,方便定位// 或者生成一个默认的View,提供给用户有用的信息——如果的确不至于让app crash的话}return convertView;
}

通过上面的方式,如果自己的getView的逻辑返回了null的话,就可以根据堆栈直接定位到错误代码的位置。

注意:getView返回null从java语法上是没问题的,虽然根据约定,它返回null肯定会引发空指针异常——但是这是对调用getView的方法而言。根据堆栈,在页面的ListView显示其childView时,如果getView返回null,android.widget.AbsListView.obtainView方法就抛出异常。堆栈信息只跟踪到LisView,而不会指向具体的Adapter。

(本文使用Atom编写)

转载于:https://www.cnblogs.com/everhad/p/5879864.html

[异常特工]android常见bug跟踪相关推荐

  1. Android面试必过——Android常见的问题

    Android常见的问题 标签(空格分隔): 移动开发 常见算法问题的 Java 实现 资料可见 算法介绍可见 算法是很多公司面试必须,国内 BAT 基本面试中都会有,尤以百度为盛. 常见设计模式的 ...

  2. Android常见的问题

    转载:http://stane.sinaapp.com/android面试必过-android常见的问题/ 水平有限,有错误请提出来. Android常见的问题 标签(空格分隔): 移动开发 常见算法 ...

  3. 项目管理大法归档 - 思维导图、原型工具、接口测试、设计模式、版本管理、单元测试、持续集成、代码审查、Bug 跟踪

    项目管理大法归档 - 思维导图.原型工具.接口测试.设计模式.版本管理.单元测试.持续集成.代码审查.Bug 跟踪 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) ...

  4. android 常见死机问题-如何分析

    android 常见死机问题--log分析 ============================================================================== ...

  5. android 常见死机问题--log分析

    android 常见死机问题--log分析 ============================================================================== ...

  6. 开发工具:收集12 个顶级 Bug 跟踪工具,值得收藏!

    作者 | Eugene Stepnov 译者 | 张健欣 策划 | Tina 来源丨架构头条(ID:ArchFront) 在如今的在线世界,几乎所有的公司都面临它们产品中的 bugs,并且考虑如何管理 ...

  7. 如何在本地搭建一个Android应用crashing跟踪系统-ACRA

    https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6 ...

  8. Android常见漏洞

    Android常见漏洞 漏洞名称: Log敏感信息泄露 漏洞描述: 程序运行期间打印了用户的敏感信息,造成泄露 修改建议: 建议禁止隐私信息的log 漏洞名称: web https校验错误忽略漏洞 漏 ...

  9. 战地5服务器不显示ping怎么回事,战地5常见bug解决办法分享

    战地5游戏想现在已经全面开放,作为一款刚刚公测推出的游戏,现在在游戏中难免会存在一些bug,不少玩家都 遇到过各种各样的bug.遇到bug怎么办?iefans小编整理了当前最热门的几个bug进行了汇总 ...

最新文章

  1. 机器学习基础专题:高斯分布
  2. 如何预约升级鸿蒙,超过66万人预约,华为亮出真正王牌旗舰,支持优先升级鸿蒙系统...
  3. Tensorflow【实战Google深度学习框架】基于tensorflow + Vgg16进行图像分类识别
  4. python3爬虫入门教程-有什么好的python3爬虫入门教程或书籍吗?
  5. java(5)——数据类型中的字符型和布尔类型
  6. 更改用户密码oracle,oracle数据库更改用户密码
  7. WTM系列视频教程:WebApi
  8. php 匹配双字节字符串,收集一些常用的正则表达式(匹配中文字符、匹配双字节字符、匹配HTML标记、匹配空行 and so on~~~)...
  9. 如何保证添加自定义对象元素的唯一性
  10. Linux后台执行命令
  11. Windows域控设置客户端禁用运行/cmd命令行【全域策略生效】
  12. 51nod1574排列转换
  13. python 类属性 对象属性_python 类属性、对象属性
  14. somachine3.1 注册
  15. 火遍全网的2000款热门短视频剪辑素材+经典音效包素材来了,还不快收下
  16. STC15系列单片机-I/O口小结
  17. yapi 权限_YApi
  18. niosii spi 外部_niosii boot过程
  19. Excel同时打开两个窗口的方法
  20. java如何批量生成二维码,并返回成压缩包形式?

热门文章

  1. 改变TabNavigator控件第一个tab标签的偏移量.
  2. [转]linux下的fms2流媒体服务器搭建六部曲之五-----flv播放器制作篇
  3. android广播接收器
  4. BP神经网络基本原理
  5. 【高德地图API】那些年我们一起开发的APP—即LBS应用模式分享
  6. Oracle中判断空游标的方法
  7. SQL Server中的角色(服务器级别和数据库级别角色)
  8. iOS初级开发笔记:Block回调,实现简单的绑定支付宝逻辑
  9. 面对众多的前端框架,你该如何学习?
  10. 20172307 结对编程项目-四则运算 第二周 阶段总结