NullPointerException:SwipeRefreshLayout.setColorViewAlpha(SwipeRefreshLayout.java:220)

最近因为项目改需求把一个原来不需要刷新的界面改成需要进行刷新操作的界面,首先想到的是加headview但这个做法可能导致我要手写二三十个findset方法,这个简直是折磨人,于是本人想到直接套个SwipeRefreshLayout来解决简单粗暴,于是使用过程中发现当正在加载转圈圈的过程中我返回上一级界面的时候出现NullPointerException:

UncaughtException detected: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.drawable.Drawable.setAlpha(int)' on a null object reference
at android.support.v4.widget.SwipeRefreshLayout.setColorViewAlpha(SwipeRefreshLayout.java:220)
at android.support.v4.widget.SwipeRefreshLayout.reset(SwipeRefreshLayout.java:202)
at android.support.v4.widget.SwipeRefreshLayout.onDetachedFromWindow(SwipeRefreshLayout.java:216)
at android.view.View.dispatchDetachedFromWindow(View.java:13568)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2838)
at android.view.ViewGroup.clearDisappearingChildren(ViewGroup.java:5638)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2837)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2835)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2835)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2835)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2835)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2835)
at android.view.ViewRootImpl.dispatchDetachedFromWindow(ViewRootImpl.java:2984)
at android.view.ViewRootImpl.doDie(ViewRootImpl.java:5502)
at android.view.ViewRootImpl.die(ViewRootImpl.java:5479)
at android.view.WindowManagerGlobal.removeViewLocked(WindowManagerGlobal.java:369)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:324)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3742)
at android.app.ActivityThread.access$1400(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1357)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

出现一个无语的bug,出现在点进去setColorViewAlpha方法:

    private void setColorViewAlpha(int targetAlpha) {
        mCircleView.getBackground().setAlpha(targetAlpha);
        mProgress.setAlpha(targetAlpha);
    }

断点走到这个方法的第一行结束后就出现空指针,mCircleView对象竟然是空对象所以导致执行到这儿才报错的,这个不合理啊,谷歌设计的控件怎么可能出现这么低级的错误呢,我开始怀疑是我的用法错误导致的,但是我新建一个项目反复测试了好几遍发现没有任何问题,唯独手上的项目出现这个bug,百度谷歌搜索好久都没找到一个解决方法,于是还是使用了加headview来实现这个需求。这几天手上事忙完了开始研究这个无语的bug,突然想到是不是界面销毁的时候是不是做了什么导致mCircleView为空呢,于是查看基类方法发现其他同事在onDestroy方法里面加了一个释放子view资源的操作:

-------------------循环遍历子view--------------------------------
        if (view instanceof ImageView) {
            ImageView imageView = (ImageView) view;
            d = imageView.getDrawable();
            if (d != null){
                d.setCallback(null);
            }
            imageView.setImageDrawable(null);
            imageView.setBackgroundDrawable(null);
        }

这下明白了,mCircleView就是ImageView的子类,这里直接将子view的backgroundDrawable设置成null了,所以执行到setColorViewAlpha方法时就出现了这样的错误。看来有的时候要解决这些先前代码给后来代码挖的非恶意的坑真不是一件简单的事,还是需要多方面尝试才能找出这些隐藏很深的bug。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值