提高Android Support Library稳定性的三个关键方法

在Crashlytics,我们经常帮助开发者探索如何建立最稳定应用的方法。抱着这个想法,最近我们开始研究安卓应用崩溃的普遍原因。尤其令我们好奇的是能否在Android Support Library中找到应用崩溃的一些蛛丝马迹,因为这是安卓应用中最广泛使用的Library之一。(貌似是老外写的)

在我们分析的一亿个崩溃里,发现大约有4%的崩溃与这个Support Library有关。通过更深层次的分析,我们的研究表明,绝大多数的崩溃是由一些常见较小的错误造成,而且这些错误却可以避免的。基于这些分析,我们确定了那些使用Support Library时往往被忽略的一些最佳实践,以及三个提高稳定性的关键方法。

1、AsyncTasks和配置信息改变

AsyncTasks(异步任务)经常用于实现后台操作,以及操作完成后选择性更新用户界面。使用AsyncTasks和处理配置信息的改变(Configuration Changes)是常见漏洞的来源。当AsyncTask正在运行时,如果fragment与对应的activity脱离,当尝试进入activity时,你的应用就会调用栈时崩溃,例如下面这个崩溃:

java.lang.IllegalStateException: Fragment MyFragment not attached to Activity

at android.support.v4.app.Fragment.getResources(Fragment.java:551)

at android.support.v4.app.Fragment.getString(Fragment.java:573)

在堆栈的最顶端,fragment要依赖一个有效的activity来获取应用的资源。预防这种崩溃的一种方法,是在配置发生变化时保留该AsyncTask任务。实现这种方法可以使用RetainedFragment来执行AsyncTask并通知监听器关于AsyncTask操作的状态。更多信息请查看这个示例FragmentRetainInstance.java

2、安全地执行Fragment Transaction

Fragment transactions用于在一个Activity上添加、移除或者替换fragment。大多数时候,fragment transaction会在activity的onCreate()方法中执行,也可能在与用户交互中响应。然而,我们看过很多的例子都是当恢复一个activity时,fragment transaction被执行了。发生这种情况时,你的应用就可能发生下面的下崩溃:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327)

at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager:1338)

at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)

at android.support.v4.app.BackStackRecord.commit(BackStackRecord:574)

at android.support.v4.app.DialogFragment.show(DialogFragment:127)

不管何时,如果一个FragmentActivity放在后台,对应FragmentMangerImpl中mStateSaved的flag就会设置为true。这个flag是用来检查是否有state loss。当试图执行一个transaction时,如果这个flag为true,那么首先会抛出IllegalStateException异常。要防止state loss,在onSaveInstanceState()方法调用前,不能执行fragment transaction。发生崩溃可能会的原因是,状态已经保存但flag还没有设置回false就已经调用了onResume()方法。

要预防这种崩溃,就要防止在activity的onResume()方法中执行fragment transactions。不然就使用onResumeFragment()方法,这个方法推荐用来解决在合适的状态与fragment打交道的情形。

3、管理Cursor的生命周期

CursorAdapter可以容易地将Cursor的数据绑定在一个ListView对象上。然而,如果一个cursor变为无效时,如果更新用户界面,就会发生下面的崩溃:

java.lang.IllegalStateException: this should only be called when the cursor is valid

at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:245)

at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:253)

当CursorAdapter的mDataValid字段设置为false时,就会抛出这个异常。发生这种情况的原因如下:

cursor被设置为空;

cursor上的一个重新查询操作失败了;

data上的onInvalidated()方法被调用了。

发生这种情况的一个原因是,是否同时使用CursorLoader和startManagingCursor()方法来管理你的cursor。startManagingCursor()已经被弃用了,取而代之的是CursorLoader。如果你正使用fragments,请确保使用CursorLoader来管理cursor的生命周期,并且移除所有startManagingCursor()和stopManagingCursor()方法的引用。

小结

通过上述三个注意事项,能大大减少Support Library抛出致命异常的机率。这样能带来更好的用户体验,更好的评分和一个更成功的应用。

Crashlytics for Android会报告来由Support Library或者应用其它地方抛出的未捕获异常。添加Android SDK到你的应用上,来看看还有哪些被你忽略的崩溃吧。

时间: 2024-08-02 00:58:31

提高Android Support Library稳定性的三个关键方法的相关文章

Android Support library

1, Android Support V4, V7, V13是什么? 本质上就是三个java library. 2, 为什么要有support库? 如果在低版本Android平台上开发一个应用程序,而应用程序又想使用高版本才拥有的功能,就需要使用Support库. 3, 三个Support 库的区别和作用是什么? Android Support v4 是最早(2011年4月份)实现的库.用在Android1.6 (API lever 4)或者更高版本之上.它包含了相对V4, V13大的多的功能.

Android support library支持包常用控件介绍(二)

谷歌官方推出Material Design 设计理念已经有段时间了,为支持更方便的实现 Material Design设计效果,官方给出了Android support design library 支持库,让开发者更容易的实现材料设计的效果.顺便推荐官方的一个图标库:Material Icons 控件名称 NavigationView FloatingActionButton TextInputLayout Snackbar TabLayout AppBarLayout Coordinator

Android Studio中Android Support Library升级到 23.0.0 报错!

Android Support Library升级到 23.0.0  报错解决方案 不得不说,真能折腾!将Android Studio中SDK下的 Android Support Library 升级到了23.0.0,结果倒好了,创建项目出问题了,还比较奇葩: 卧槽你大爷!尼玛还能不能好好玩耍了.各种卸载重装,就差重装系统了. 后来在神器stackoverflow中找到了这么一篇: http://stackoverflow.com/questions/32092511/resource-erro

理解安卓支持库(Android Support Library)

安卓平台其中一个很牛逼的地方在于它支持各种不同的设备.从你的平板电脑,到你的手机,电视等,安卓无处不在.安卓想成为一个全领域的移动计算平台.光从它的数量上来说,已经算是很成功了. 支持所有这些设备是有一些挑战的.不管硬件还是软件上的不同,用户希望应用程序可以在每一台设备上用样的运行:同样,对于开发者来说,你不能总指望用户已经升级到最近的安卓版本.事实上,开发者遇到的用户大多使用18个月前或者更老的版本. 如果没有安卓团队的帮助,开发者会不得不做些“丑陋的代码”去兼容那些使用老版本的用户.幸运的是

Support v4 v7 v13: Android Support Library

Android Support v4:  这个包是为了照顾1.6及更高版本而设计的,这个包是使用最广泛的,eclipse新建工程时,都默认带有了. Android Support v7:  这个包是为了考虑照顾2.1及以上版本而设计的,但不包含更低,故如果不考虑1.6,我们可以采用再加上这个包,另外 注意,v7是要依赖v4这个包的,即,两个得同时被包含. Android Support v13:这个包的设计是为了android 3.2及更高版本的,一般我们都不常用,平板开发中能用到. Andro

Android Support Library package简介

转自http://my.oschina.net/chengliqun/blog/148451 N久未做android了,以前做的时候,2.2才刚出来,现在android都更新到了4.3了,而从前一段时间android各个sdk版本市场占有率 来看,1.6.2.1还是占有一定的市场,故在有些时候,我们还是得要考虑兼容这些版本. google提供了Android Support Library package 系列的包来保证来高版本sdk开发的向下兼容性,即我们用4.x开发时,在1.6等版本上,可以

[Xamarin.Android] Support Library Tips

[Xamarin.Android] Support Library Tips Support Library支持内容 Xamarin Support Library每个版本支持.那些组件,可以参考这份简报的第8张. Backwards Compatibility in Xamarin.Android Made Easy

Android Support Library介绍

v4 Support Library 这个库是为Android 1.6(API版本为4)及以上的版本设计的,它包含大部分高版本中有而低版本中没有的API,包括application components.user interface features.accessibility.data handling.network connectivity.and programming utilities,下面是对V4中的一些关键API的介绍: App Components Fragment:通过它可以

Android Support Library 23.2

Android Support Library 23.2 When talking about the Android Support Library, it is important to realize this isn't one monolithic library, but a whole collection of libraries that seek to provide backward-compatible versions of APIs, as well as offer