项目: TFTD
今天在Nook Tablet上面测试背景音乐的问题,往复N次发现,app 会crash. 报出的exception是: 数据越界,
06-01 00:48:53.037: E/AndroidRuntime(6180): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
06-01 00:48:53.037: E/AndroidRuntime(6180): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
06-01 00:48:53.037: E/AndroidRuntime(6180): at java.util.ArrayList.get(ArrayList.java:311)
06-01 00:48:53.037: E/AndroidRuntime(6180): at com.xxx.application.TFTDApplication.setBooleanFavorite(TFTDApplication.java:489)
06-01 00:48:53.037: E/AndroidRuntime(6180): at com.xxx.activity.ThoughtsActivity.onResume(ThoughtsActivity.java:364)
06-01 00:48:53.037: E/AndroidRuntime(6180): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
06-01 00:48:53.037: E/AndroidRuntime(6180): at android.app.Activity.performResume(Activity.java:3839)
06-01 00:48:53.037: E/AndroidRuntime(6180): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
06-01 00:48:53.037: E/AndroidRuntime(6180): ... 19 more
究其原因是在后一个activity的onResume()方法中与前一个activity异步的加载数据的代码块共用了一个数据集合对象,导致数据越界,这个问题找了好久好久,都没有发现,
现在终于明白了,一直想不明白为什么,明明打印出来是size == 3, 为什么用for循环取的时候还是会越界。
终于发现了,为什么会前面一个activity会再次运行呢?明明已经创建过了,为什么还会再次onCreate()?不明白,为什么这个问题在Nook Tablet上出现了,在手机端不易出现。
找了好久,终于发现:这跟你用什么方式来打开app有关系。
在手机上,我一般都是从桌面直接点击打来,或者直接在app里直接打开。
这次在Nook Tablet上面我其实是通过文件浏览器打开的,我使用了Search功能,找到后直接点击。我发现这个点击操作其实是重新发出了一个intent,导致这个activity会重新创建运行,而并不管这个app是否已经运行了,activity是否已经存在实例了。对于那些在处在后台的app也重新创新一个新的activity打开。
我又在手机端,使用search功能找到我的app,点击,发现我的app中的activity也会重新onCreate()。
因此activity重新onCreate()一下。
测试方法:
1. 看看TFTDApplication 的onCreate()方法是不是重新执行了 ===》 false
2. 看看MyTabActivity 的onCreate()方法是不是重新执行了 ===》 true
3. 看看ThoughtsActivity 的onCreate()方法是不是重新执行了 ===》 true
当然这个也跟你的Activity创建方式的设置有关系!!!