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

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

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

  • 错误姿式:

    • 新项目发布到线上后,就有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解决。

推荐阅读更多精彩内容