2015-07-13 217 views
1

我遇到了令人沮喪的問題。 我有一個列表,它有一個適配器。 我的適配器有一個ArrayList,它保存對ImageViews的引用。無法恢復活動IndexOutOfBoundsException:索引0無效,大小爲0

我的一個片段中有一個用戶可以從設備目錄中選擇文件的功能。然後,onActivityResult會根據索引將返回的位圖的縮略圖設置爲imageView。 所以從片段我打電話像adapter.getImageView(pos).setBitmap(bm)。

問題:當用戶瀏覽圖片庫一段時間並最終選擇時,我的應用程序崩潰,出現錯誤無法恢復活動,因爲索引超出了我的onActivityResult範圍,因爲它調用了getImageView(pos )

我認爲發生的事情是,當用戶瀏覽時間過長時,操作系統會回收我的應用程序並將其銷燬,然後在用戶返回時嘗試重新創建它。奇怪的是,我的適配器不是空的,只是ArrayList未初始化。 另一個奇怪的事情是我嘗試調試並將Log.v放入該片段的onResume()以及onActivityResult中。 在這兩種情況下,它似乎甚至沒有進入那些崩潰之前的方法。我很困惑...請幫助。

這裏充滿例外

java.lang.RuntimeException: Unable to resume activity {com.core.somepackage/com.core.somepackage.SomeActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=67536, result=-1, data=Intent { dat=content://media/external/images/media/33276 flg=0x1 }} to activity {com.core.somepackage/com.core.somepackage.SomeActivity}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2742) 
      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2771) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2235) 
      at android.app.ActivityThread.access$600(ActivityThread.java:141) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:5039) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=67536, result=-1, data=Intent { dat=content://media/external/images/media/33276 flg=0x1 }} to activity {com.core.somepackage/com.core.somepackage.SomeActivity}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
      at android.app.ActivityThread.deliverResults(ActivityThread.java:3319) 
      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2729) 
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2771) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2235) 
            at android.app.ActivityThread.access$600(ActivityThread.java:141) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:5039) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
            at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
      at java.util.ArrayList.get(ArrayList.java:304) 
      at com.core.local.utils.adapters.UploadRecyclerViewAdapter.getImageView(UploadRecyclerViewAdapter.java:108) 
      at com.core.main.UploadImageScreen.onActivityResult(UploadImageScreen.java:246) 
      at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:165) 
      at android.app.Activity.dispatchActivityResult(Activity.java:5293) 
      at android.app.ActivityThread.deliverResults(ActivityThread.java:3315) 
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2729) 
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2771) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2235) 
            at android.app.ActivityThread.access$600(ActivityThread.java:141) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:5039) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
            at dalvik.system.NativeStart.main(Native Method) 
+0

這個錯誤意味着你的數組列表中沒有數值。但在應用程序的某個時刻,您正在使用索引調用其中一個值。如果你瀏覽短時間>會發生什麼? – Sheychan

+0

如果在短時間瀏覽一切都很好。這種情況隨機發生時,我認爲OS釋放記憶 – vankiz

回答

0

我之前見過類似的問題,你可以嘗試onRestoreInstanceState的onSaveInstanceState和在method.In的onSaveInstanceState,可以節省 您的數據;在onSaveInstanceState方法中,您可以獲取之前保存的數據。

protected void onSaveInstanceState(Bundle outState) { 
    outState.putInt("param", param); 
    super.onSaveInstanceState(outState); 
} 

protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    param = savedInstanceState.getInt("param"); 
    super.onRestoreInstanceState(savedInstanceState); 
} 

這兩種方法above.In我的測試,onRestoreInstanceState被調用之前的onResume method.You可以試試這些方法,我希望這會有所幫助。

+0

感謝您的建議。我有計劃創建恢復實例狀態。沒想到這會發生。明天會試試看。這樣做後會在這裏發佈。 – vankiz

+0

@vankiz是否解決了您的問題? – Sufian

相關問題