Bug记录

作者: hjm1fb | 来源:发表于2017-09-16 17:16 被阅读37次
    1. TabLayout如果不设置tabIndicatorColor会抛如下异常
    android.view.InflateException: Binary XML file line Error inflating class <unknown>...
    Caused by: java.lang.RuntimeException: Failed to resolve attribute at index 0 at android.content.res.TypedArray.getColor(TypedArray.java:422)
    
    1. 在MIUI上发现某个横向的RecycleView不显示,但其他页面的横向RecycleView或者其他机型上都会显示。
      最后通过调试得出是recycleView中textView不知道因为什么原因没有显示(估计是MIUI的ROM在layout时的一个bug),所以解决方案是给textview设置固定高度。之前也遇到过测试反馈说在Nexus上和硬件的连接不稳定,开始也当兼容性bug来解决,最后终于发现是这台Nexus自身的wifi有问题 /(ㄒoㄒ)/~~

    2. TextView显示中英文数字混合的字符串时的bug.
      在TextView设置了

    android:maxLines="1"
           android:ellipsize="end"
    

    要显示的字符串是“更新至:鸽子和猎人+ThereWereNinetyAndNine”
    预期显示“更新至:鸽子和猎人+ThereWereNinetyAnd。。。”,但最后显示“更新至:鸽子和。。。”
    解决方案是加上
    android:singleLine = "true"

    It is a huge 坑

    1. ConcurrentModificationException
      字面意思就是在遍历的时候容器执行了写操作或者有并发的写操作。所以解决方案是保证遍历过程中没有对容器进行操作;或者用iterator的方法(比如iterator.move)执行写操作,但每次只能有一个iterator进行写操作,也就是要考虑并发,如何处理并发?用Concurrent容器类或者用sychronized修饰方法。最后,如果生成iterator之后,用容器自己的API(如list.add)执行写操作,那么调用iterator遍历也会报ConcurrentModification错误。
      原理参考

    2. exception: android.os.BinderProxy cannot be cast to...
      解决方案:

    3. cast之前用 instance of 判断。如果exception发生在Application里,也可以判断当前Application是不是默认Application

    4. 在Activity里而不是在Application里调用bindService

    5. 使用AIDL

    6. 在华为荣耀H60-L02上,设置了TextView的layout_alignParentBottom属性(父布局和爷爷布局都是RelativeLayout),但不起作用。解决方法是设置爷爷布局的layout_height属性为固定值。(ROM的兼容性bug)

    7. 在FrameLayout中重叠的两个surfaceview,在8.0以前是第一个定义的surfaceview处于window的最上层,会覆盖住第二个surfaceview。而8.0上则相反,不造为什么这么设计,网上没找到资料。
      可以通过给其他一个surfaceview设置半屏的size可以看哪个surfaceview在顶部。
      通过SurfaceView.setZOrderMediaOverlay(true)可以强制某个SurfaceView显示在另一个的顶部

    8. 为了更好的分析bug,可以把log保存到文件中分析。拦截监听系统log的方法:

     var filePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/myLog.txt"
      Runtime.getRuntime().exec(arrayOf("logcat", "-f", filePath,"*:S", "MyLogTag1:V","MyLogTag2:V"))
    
    1. Scrollview的子View设置了MarginTop,且长度超过一屏,就会滑不到底,只要不设置marginTop而是在Scrollview上设置paddingTop就可以了

    2. 如果RecyclerView的父辈布局有ScrollView,NestedScrollView,可能会导致RecyclerView滑动卡顿。
      解决方案是设置setNestedScrollingEnabled(false), 当然前提是不需要此RecyclerView的嵌套滑动。

    3. 在webView中打开微信文章的url,文章中的超链接点击可以跳转,但是“阅读原文”点击了不能跳转。
      解决方案是设置

    webView.settings.domStorageEnabled = true;
    

    推测原因如下:
    “阅读原文”的跳转地址是通过js代码动态设置的:

    document.getElementById('js_view_source').href=window.msg_source_url;
    

    而这段js可能用到了localStorage,安卓目前因为安全性考虑,默认关闭localStorage功能。因此这段js就不能执行成功,导致“阅读原文”的跳转也没有设置,就点击没反应了。
    像类似的问题可以通过Chrome Inspcet Device排查原因。
    webView的通用设置如下:

     //防止硬加速导致动画卡顿
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
            }
            webView.settings.javaScriptEnabled = true
            webView.settings.domStorageEnabled = true;
            webView.webChromeClient = WebChromeClient()
            webView.webViewClient = MyWebViewClient()
    
     private inner class MyWebViewClient : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
                view.loadUrl(url)
                return true
            }
        }
    
     override fun onBackPressed() {
            if (webView != null && webView.canGoBack()) {
                webView.goBack() // goBack()表示返回WebView的上一页面
                return
            }
            super.onBackPressed()
        }
    
    override fun onDestroy() {
            super.onDestroy()
            if (webView != null) {
                val parent = webView.getParent() as ViewGroup
                parent.removeView(webView)
                webView.removeAllViews()
                webView.destroy()
            }
        }
    
    1. 如果targetVersion设置成了22或以下,默认权限是全部授予的,但是可能会被用户手动取消。
      这时候checkSelfPermission永远返回true,requestPermissions方法也不会弹出权限对话框,只能是引导用户去设置页授予应用权限
      http://blog.csdn.net/happylishang/article/details/78222788
      https://stackoverflow.com/questions/35484767/activitycompat-requestpermissions-not-showing-dialog-box
    1. 使用SimpleDraweeView,加载某些图片会模糊(大图加载)

    之前为了解决图片太大,无法在某些安卓机上加载,就启用了向下采样,也就是setDownsampleEnabled(true)
    但是发现新人问答这张图 (像素值750*3000) 加载了比较模糊。后来调试不同长宽和格式的图片,觉得是因为新人问答这张图要显示的长度很长,不采样可以正常显示,采样像素值就不够了, 所以显示模糊。
    在网上查找资料,包括GitHub和StackOverFlow。虽然有人遇到到这样的
    问题,但还没有解决的方法。虽然有妥协的方案,就是不采样,然后遇到加载不了的图,就让UI把图片的像素值调低一些,但最后还是觉得看下源码。最后调试源码时,得到了如下解决方案:
    可以设置多大的图片才需要采样,比如模糊的图的最大维度(宽或长上面的像素值,取较大值)是3000,只要设置ResizeOptions的maxBitmapSize为3000以上,比如我设置成4000。这样只有最大维度是4000以上,才会采样。而4000已经是比较高的值了,新人问答图如果还要变的更长,超过4000的像素值,就需要调整图片的长宽比以适应屏幕比例,或者图片内容不变的情况下增大像素值。这样屏幕适配缩放后,仍有较高的像素密度,也就不怕采样了。
    这个解决方案的缺陷是不能直接按最终展示的图片的像素密度决定是否采样,而是根据原始图片的最大像素维度,但解决问题是OK的。

    1. Webview无法点击微信文章的阅读原文
      虽然设置了支持跳转,但仍然无法点击“阅读原文”,通过查看微信文章的js源码,发现“阅读原文”对应的链接是通过执行js代码动态绑定的。然后搜索此超链接的字段名,搜到一篇文章,说要设置
      webView.settings.domStorageEnabled = true;
      尝试此方案后解决。但仍需要了解为什么能解决:是因为设置“阅读原文”超链接的js代码,会用到domStorage属性,如果没有启用,执行这段js就抛异常,导致后面设置链接的代码没有执行。
      这样的异常信息在PC端可以在浏览器的开发者工具中看到,在安卓端则需要用Chrome Inspcet Device调试
      所以下次遇到Webview相关的问题,可以通过Chrome Inspcet Device来排查,也可以看看是不是js代码没有执行成功导致的。

    相关文章

      网友评论

          本文标题:Bug记录

          本文链接:https://www.haomeiwen.com/subject/mjcusxtx.html