美文网首页
Android开发错误姿式100手 16-20

Android开发错误姿式100手 16-20

作者: ssevening | 来源:发表于2017-08-09 21:14 被阅读0次

    继续分享错误姿式,全是实战,不说对的,只玩错的,全是坑,一坑一天,一坑一辈子,一旦入坑,深似海。

    十六、为了更好的用户体验

    • 错误姿式:

      • 新项目发布到线上后,就有4.x系列的用户报错,java.io.NotSerializableException错误,其他系统没有错误。
    • 原因:

      • 在开发者选项中,有一个不保留活动的选项,测试同学在测试时,使用了此选项进行测试,即当Activity退到后台时,Activity保留的一些变量值会变为空。开发为了避免此类情况的产生,把当前页面对象进行序列化保存。如下代码中的:productInfo对象。
      @Override
      public void onSaveInstanceState(Bundle saveInstance){
          super.onSaveInstanceState(saveInstance);
          productInfo.channelName = "save channel";
          saveInstance.putSerializable("product", productInfo);
      }
      

      但ProductInfo对象又包含其他的对象,如果其他对象未实现 Serializable接口,那就会抛出上述的异常。

    • 解决方案:

      • 把ProductInfo下面涉及到的所有对象进行查看,未实现Serializable接口的实现掉。
      • 发布新版本修复。
    • TIPS 上面说的不保留活动和用户体验怎么个事情:

    1. 保存数据就是上面的代码,在内存不足时,要对AC进行回收的时候,把用户当前页面的数据进行保存。
    2. 显示数据就可以做如下操作,当再次执行onCreate时,判断一下我们曾经有没有存储过用户数据。
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 玩一下保留活动
            if (savedInstanceState == null) {
                productInfo = new ProductInfo();
                productInfo.channelName = "channelName";
            } else if (savedInstanceState.getSerializable("product") != null) {
                productInfo = (ProductInfo) savedInstanceState.getSerializable("product");
            }
    
            Toast.makeText(this, productInfo.channelName, Toast.LENGTH_SHORT).show();
    
    

    十七、上线安全需求,导致部分功能不可用。

    • 错误姿式:

      • 发布新版本,用户反馈部分付款功能不可以用, 提示打不开网页。
    • 原因:

      • 本次上线了安全需求,非白名单内的域名不充许在webview中打开,然后想想,如果万一哪些域名被漏掉了,服务端可以针对漏掉的域名进行白名单下发。这样项目的风险要小一些,然而,千算万算,没有想到,支付网址涉及到成千上百家银行的域名,无法穷举,所以虽然有域名的白名单下发,但也无力回天了。
    • 解决方案:

      • 只好在打开支付的时候,不进行白名单过滤了。
      • 但想想,针对这种大型的这发全口子,还应该增加一个总开关,万一有问题,可以在远程服务端中关掉他,快速解决用户线上的问题。

    十八、Android M queryIntentActivities return null list 蹲坑记

    • 错误姿式:

      • 为了模块化开发,上线了路由框架,是基于 queryIntentActivities的方式,但线上6.0以后,引入了App LINKS,用户如果在设置中关掉了 App LINKS,那就查询不到处理的Intent,然后出现死循环。
    • 原因:

      • Android M 6的原因,导致关掉APP LINKS时,返回为空,然后在返回为空的时候,又用了用路由去进行打开网页的操作。导致又一次触发了路由。又玩出一次死循环。
    • 解决方案:

      • 因为关掉的是 android.intent.action.VIEW 那我们新建一个: NAV.ACTION,然后查询的时候,查询NAV.ACTION,即不再受APPLINKS的影响。
      • 出现为空的时候,要打开WebView,也不再使用路由,而是改为直接的startActivity来解决,避免路由调用路由,从而出现死循环的问题。

    见下面详细链接:Android M queryIntentActivities return null list


    十九、网页上部分图片不显示

    • 错误姿式:

      • 用webview加载网页时,部分网页图片不显示,部分网页图片又OK,在PC上打开的话,都是OK的。
    • 原因:

      • 要打开的网页为 https的网页,但网页中引入的资源图片却为 http, 在Android5.0 以后,增加了安全,禁止http 和 https 混合式开发。
    • 解决方案:

      • 可以添加如下代码:在内容混合时,总是充许。
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                  wv_desc.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
      

    }

    ```
    

    二十、R 值编译竟然不过,但打RELEASE包没有问题,WTF?

    • 错误姿式:

      • 在引入一个新的组件后,然后客户端的R就编译不过了,然后左思右想,也不知道是什么原因,然后天天看着红XX过日子,心里泛着蛋蛋的优伤。
    • 原因:

      • Android Studio 安装目录下,bin下面有个 idea.properties 配置文件,其中一个参数是:idea.max.intellisense.filesize=2500 ,指R文件的最大在小是2500KB,然后我们的项目又有N多资源文件,然后,R文件就太大了。提示编译不过。
    • 解决方案:

      • 修改上述 idea.max.intellisense.filesize=5000 并重启AS解决。

    相关文章

      网友评论

          本文标题:Android开发错误姿式100手 16-20

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