一个crash问题的哲学思想

29 篇文章 0 订阅

工程实践中,哲学思想常常可以来提供指导。处理程序问题也时常体现出哲学思想。

这里通过一个crash的实例来讨论下,

发生google service crash,log如下
01-01 12:15:53.075345 1021 3148 D AES : Package: com.google.android.gms v11746446 (11.7.46 (446-175121617))
01-01 12:15:53.075345 1021 3148 D AES : Foreground: No
01-01 12:15:53.075345 1021 3148 D AES : Build: Nokia/TA-1020_00WW/NE1:8.0.0/O00623/00WW_3_060:user/release-keys
01-01 12:15:53.075345 1021 3148 D AES :
01-01 12:15:53.075345 1021 3148 D AES : android.view.WindowManager$BadTokenException: Unable to add window – token android.os.BinderProxy@7c16132 is not valid; is your activity running?
01-01 12:15:53.075345 1021 3148 D AES : at android.view.ViewRootImpl.setView(ViewRootImpl.java:883)
01-01 12:15:53.075345 1021 3148 D AES : at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:361)
01-01 12:15:53.075345 1021 3148 D AES : at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:92)
01-01 12:15:53.075345 1021 3148 D AES : at android.app.Dialog.show(Dialog.java:336)
01-01 12:15:53.075345 1021 3148 D AES : at aols.run(:com.google.android.gms@11746446:6)
01-01 12:15:53.075345 1021 3148 D AES : at android.os.Handler.handleCallback(Handler.java:869)
01-01 12:15:53.075345 1021 3148 D AES : at android.os.Handler.dispatchMessage(Handler.java:101)
01-01 12:15:53.075345 1021 3148 D AES : at android.os.Looper.loop(Looper.java:206)
01-01 12:15:53.075345 1021 3148 D AES : at android.app.ActivityThread.main(ActivityThread.java:6733)
01-01 12:15:53.075345 1021 3148 D AES : at java.lang.reflect.Method.invoke(Native Method)
01-01 12:15:53.075345 1021 3148 D AES : at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
01-01 12:15:53.075345 1021 3148 D AES : at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:845)
01-01 12:15:53.075345 1021 3148 D AES : 2797


ap层解决方案
gms里面的问题,可参见https://www.jianshu.com/p/4c5fafe08fa7
情形3.android.view.WindowManager$BadTokenException: Unable to add window – token android.os.BinderProxy@XXX is not valid; is your activity running?异常处理。
android.view.WindowManager$BadTokenException: Unable to add window –
token android.os.BinderProxy@4250d6d8 is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:698)
......
at dalvik.system.NativeStart.main(Native Method)
原因:从错误信息我们也可以明白其原因,此问题根本原因就是由于将要弹出的dialog所要依附的View已经不存在导致的。当界面销毁后再弹出来;或者界面跳转时我们的view发生改变,dialog依附的context发生变化或者界面未运行了。
解决方法:界面已经销毁引起的错误就只能判断界面是否存在然后再弹出了。
//修正后代码
if(!isFinishing())
{ alert.show(); }
参考:
http://stackoverflow.com/questions/25554279/unable-to-add-window-token-android-os-binderproxy4250d6d8-is-not-valid-is-your


等待Google去修改gms程序是一个漫长的过程。
我们继续查看 
01-01 13:53:56.194065 2910 2910 E WindowManager: android.view.WindowLeaked: Activity com.google.android.location.network.ConfirmAlertActivity has leaked window DecorView@cbb426b[] that was originally added here
01-01 13:53:56.194065 2910 2910 E WindowManager: at android.view.ViewRootImpl.<init>(ViewRootImpl.java:579)
01-01 13:53:56.194065 2910 2910 E WindowManager: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:348)
01-01 13:53:56.194065 2910 2910 E WindowManager: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:92)
01-01 13:53:56.194065 2910 2910 E WindowManager: at android.app.Dialog.show(Dialog.java:336)
01-01 13:53:56.194065 2910 2910 E WindowManager: at aols.run(:com.google.android.gms@11746446:6)
01-01 13:53:56.194065 2910 2910 E WindowManager: at android.os.Handler.handleCallback(Handler.java:869)
01-01 13:53:56.194065 2910 2910 E WindowManager: at android.os.Handler.dispatchMessage(Handler.java:101)
01-01 13:53:56.194065 2910 2910 E WindowManager: at android.os.Looper.loop(Looper.java:206)
01-01 13:53:56.194065 2910 2910 E WindowManager: at android.app.ActivityThread.main(ActivityThread.java:6733)
01-01 13:53:56.194065 2910 2910 E WindowManager: at java.lang.reflect.Method.invoke(Native Method)
01-01 13:53:56.194065 2910 2910 E WindowManager: at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
01-01 13:53:56.194065 2910 2910 E WindowManager: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:845)


基本可以确定这个问题和Imporve Location弹框com.google.android.gms/com.google.android.location.network.ConfirmAlertActivity异常有关。


01-02 06:06:59.573803 1063 1081 W ActivityManager: Activity pause timeout for ActivityRecord
{3864a52 u10 com.google.android.gms/com.google.android.location.network.ConfirmAlertActivity t1000003}


在开机的时候,系统资源比较紧张,gms中的处理超时,就导致了问题的发生。


最终的最终,采用了修改配置的方法不让Imporve Location弹框显示出来。就不会有后续的crash了,
猛然一想,这种处理方案还蕴含着哲学思想:本来无一物,何处惹尘埃。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值