android开发经常碰到的crash(下)

2024-06-15 10:58

本文主要是介绍android开发经常碰到的crash(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

结合拜读包建强前辈著作的《App研发录》,与自己开发过程中遇到的问题,继续上篇对android开发经常碰到的crash探讨。上篇已经对空指针、数组越界、数据类型转换、fragment引用资源出错、dialog关闭报错、adapter数据改变与列表更新不同步、试图调用空对象的方法、列表滚动与刷新冲突报错、栈的无限递归引起栈溢出、多dex分包造成无法找到类定义、手机的CPU架构不同造成无法加载so文件等问题作了介绍。接下来对xml布局文件、系统资源碎片化控件使用、资源加载、数据库操作、内存溢出等常见crash进行分析。

1、InflateException:Binary XML file(加载出错:二进制XML文件)

此类问题是由于XML文件引用自定义控件或者本身书写不符合规范引起的。在报错地方有指出明确的出错行数,很容易定位并且修复。


2、NoSuchMethodError(没有该方法错误)

比如由于不同android版本提供方法的参数不同引发报错:java.lang.NoSuchMethodError:android.os.Bundle.getString。这是因为SharePreference提供的getString有两种版本参数:getString(String key) 与 getString(String key, int defaultValue)。第一种是android2.3以前的版本,而android2.3以后增加defaultValue这个参数。因此,系统碎片化引发的异常告诫我们多关注不同android版本的差异。


3、Unable to find app for caller android.app.ApplicationThreadProxy when stopping service Intent(Intent传值太大报错)

Intent里面传递一般数据不会报此类错误,但如果换成Bitmap那么就成为可能了。因为通常情况下,bundle携带超过1M数据,就会抛出该异常,而Bitmap往往会超过1M。因此,在使用Intent传递数据时,需要估计数据量大小,注意不要超过1M。


4、IllegalArgumentException:Receiver not registerd(非法参数异常:接受者没有注册)

在Activity中使用ViewFlipper控件,进行横竖屏切换操作时就会发生此异常。一般原因是onDetachedFromWindow()在onAttachedToWindow()之前被调用引起的,因为还没有关联到对应窗体,就从窗体解除关联。我在做垂直滚动公告时,使用ViewFlipper控件就碰到该问题。后来自定义一个控件继承ViewFlipper重写onDetachedFromWindow()方法,里面加上try-catch。

protected void onDetachedFromWindow(){try{super.onDetachedFromWindow();}catch(IllegalArgumentException e){stopFlipping();}
}

5、Package manager has died(包管理器已经不存在)

出现此类异常说明PackageManager所在的进程已经不存在了,或者App本身处于崩溃状态。解决方法是,每次获取PackageManager时使用try-catch捕获异常。


6、IllegalStateException:Can not perform this action after onSaveInstanceState(不合法状态异常)

commit方法在Activity的onSaveInstanceState()之后被调用就会报错。因为onSaveInstanceState方法是在Activity即将被销毁前调用,以保存Activity数据。其中一种情况是,如果在保存完状态后再给它添加Fragment就会报错。对应解决方法是将commit替换成commitAllowingStateLoss()。


7、SQLException:cannot commit-no transaction is active(数据库异常:无法提交—事务不处于活动状态)

在事务中,逐条循环插入(for + insert)大量数据时会导致此类 崩溃。因为android在SQLite插入数据时默认一条语句就是一个事务。解决方法是采用sql语句加上事务机制,操作完毕设置事务成功,把数据同步给数据库。

    private void insertToDB(SQLiteDatabase db, List<String> sqlList) {db.beginTransaction(); // 开始事务try {for(String sql:sqlList) {//自定义sql语句集合遍历db.execSQL(sql);}db.setTransactionSuccessful();//设置事务成功标志} catch (Exception e) {e.printStackTrace();} finally {db.endTransaction();//结束事务}}

8、CursorWindowAllocationException:cursor window allocation of 2048KB failed(游标窗体分配异常)

这个异常是因为使用数据库查询时,忘记关闭游标导致的,内存泄露得多了,就导致崩溃。对应解决方法是手动关闭cursor。

if(cursor != null && !cursor.isClosed())cursor.close();

9、SQLiteDatabaseLockedException:database is locked(数据库被锁异常)

当我们试图在不同线程中创建多个数据库连接时,就会抛出此异常。对应的解决方法是将数据库设置为单例模式。如果是多进程,应该考虑使用Contentprovider。下面介绍下数据库的单例模式写法:

    private static ContactDBManager mInstance = new ContactDBManager(ContactApplication.getInstance());public static ContactDBManager getInstance() {return mInstance;}

10、SQLiteDiskIOException:disk I/O error(数据库磁盘IO操作异常)

有一种情况是webView中使用到数据库作为缓存,读写缓存异常引发崩溃。webView有两种缓存:网页数据缓存和HTML5缓存。而且缓存模式有5种:

模式

介绍
LOAD_CACHE_ONLY只读本地缓存数据
LOAD_DEFAULT根据cache-control决定是否从网络读取
LOAD_CACHE_NORMAL从API 11开始作用通LOAD_DEFAULT模式
LOAD_NO_CACHE不使用缓存,只从网络获取数据
LOAD_CACHE_ELSE_NETWORK只要本地有,无论是否过期,都是用缓存数据
根据以上5种模式,建议缓存策略为:判断如果有网络,使用LOAD_DEFAULT模式,否则使用模式LOAD_CACHE_ELSE_NETWORK。


11、SQLiteDiskIOException:disk I/O error(多线程操作数据库引发磁盘读写错误

考虑到多线程同时操作数据库,建议在操作数据库的方法加上syncronized关键字。


12、OutOfMemoryException(内存溢出)

android系统预先给每个app分配内存,比如80M。在AndroidManifest.xml文件加上这个语句:<application  android:largeHeap =  true>,这样可以获得更大内存分配额度。但是不可能是无限制无上限。我在一个项目中通讯录一次性加载20000条数据,就抛出此异常。性能好的手机抛出该异常的时间会延后一点,性能差的手机则会相对快一点。后来是采用分页加载分页显示,才解决此问题。另外,建议大家尽量避免内存泄露,因为内存泄露多了最终会引发内存溢出;不要频繁创建对象(能够复用就复用);涉及多线程编程,使用线程池管理(任玉刚前辈在《android开发艺术探索》书中推荐)。


13、JSONException:no value for XXX(json解析溢出)

如果在使用getString("name")而不是optString("name"),并且name这个key值在json字符串中不存在,前者会抛出异常,后者则会返回空值。类似地,还有getJSONArray方法,建议使用optJSONArray。


14、IllegalArgumentException:parameter must be a descendant of this view

这个崩溃是通过ViewGroup的offRectBetweenParentAndChild方法抛出的。该方法用来计算父子重叠区域。它是通过所给的descendant这个view逐级向上寻找Parent View,同时将Rect转换为同级坐标系来计算。如果在UI发生改变后,就会改变当前界面所拥有焦点的控件,就会引发此问题。解决方法是,每次都重新设置焦点,保证当前View始终获得焦点。与此同时,还要清空其他控件抢占的焦点。


在国庆节期间花了一个下午,来补充android开发常见的crash,自己印象更加深刻,以此告诫自己不要犯类似错误。希望也可以帮助到读者解决这些crash或者避免它们发生。



这篇关于android开发经常碰到的crash(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063262

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧