android:ArrayIndexOutOfBoundsException当我在5-10分钟后重新打开应用程序

时间:2012-08-29 13:23:28

标签: android indexoutofboundsexception

在我的应用程序中,我有一个listView。

我一次填充此listView 10个项目。

所以,当我显示一个spalsh屏幕时,我在后台获取前10个项目。一旦闪屏消失,用户就可以看到前10个项目。

现在在包含此listView的Activity中我写了这样的内容:

onLastItemReached(){
    getNextten();
}

工作正常。当我从这个listViewActivity转到另一个活动时,我设置了标志,以便在按下后退时保留所有浏览的项目(我的意思是,如果用户向下滚动到100个项目并单击一个项目并进入某些活动,点击设备后退按钮,他将显示第100个项目,其余99个项目不需要再次获取)

问题是,当我关闭应用程序并在大约5-10分钟后打开它时,它会被批评说:

ArrayIndexOutOfBoundsException

如果我在1-3分钟内重新打开它,它可以正常工作。

抱歉,我无法发布任何代码,因为所有活动都有大约800行。

任何人都知道为什么我总是得到这个例外。我想知道的一件事是,有什么像if an app is in background for more than 5 mins remove all its data

编辑:

我关闭我的应用程序,我的意思是当我在ListView屏幕上时按主页按钮,在5-10分钟后重新打开应用程序

这是我得到的StackTrace,我试图处理unCaughtExceptions:

threadid=1: thread exiting with uncaught exception (group=0x40020660)
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Android.WiC_MobileApp/com.Android.WiC_MobileApp.FeedListViewActivity}: java.lang.ArrayIndexOutOfBoundsException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1728)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1747)
at android.app.ActivityThread.access$1500(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993)

所以在查看我的日志之后,它说错误在第201行,该行包含:

    Log.d("array of product names", SplashActivity.products_array[0] + "--"
            + SplashActivity.products_array[1]);

这是一个填充在SplashActivity中的数组,并生成public static

3 个答案:

答案 0 :(得分:2)

  

如果应用在后台超过5分钟,则删除其所有数据

这实际上可能在1分钟内发生。它只是依赖于系统运行的环境。当您按下主页按钮(或顶部活动的后退按钮)时,系统会将您的应用程序置于休眠模式。它会将其保留在内存中,直到需要内存为止。这允许用户在他们想要快速切换并返回的事件中快速返回到它。几分钟后,如果用户打开游戏或其他东西,操作系统可能会决定从内存中擦除应用程序。在这种情况下,当用户重新打开您的应用程序时,您必须从头开始重建所有内容。

您的应用崩溃的原因是您在应用实际重建ListView之前尝试检索该元素。如果应用程序仍然在内存中,它可以工作,因为一切仍然是内置的。如果删除了应用程序,则必须重建列表,重新充气或其他任何内容。然后你尝试检索元素。

答案 1 :(得分:2)

当你的应用程序在后台时,Android可以随时终止它(只需杀死你的活动正在运行的进程)。如果用户想要返回到您的应用,Android会为您的应用创建一个新流程,然后重新创建仅活动堆栈顶部的活动(即:显示的时间你的应用程序转到后台)。

从日志中看,您尝试启动FeedListViewActivity时应用程序崩溃了。由于这可能是您的应用程序进入后台时显示的活动,因此Android似乎正在尝试重新创建活动,这意味着您的进程在应用程序处于后台时被杀死(请参阅上面的说明)。 / p>

您说您尝试访问的数据是由SplashActivity设置的,并保存在静态变量中。问题是,当Android为您创建新流程时,它只会重新创建顶级活动,而不是重新创建其下的所有活动。它不会重新创建SplashActivity,因此尚未初始化变量。

以下是一些可能的替代方案:

  1. 检查是否已在onCreate() FeedListViewActivity中重新创建了该流程,如果是,则需要重新创建SplashActivity之前设置的数据列表为你服务。您可以通过SplashActivity在运行时将public static boolean变量设置为true并在FeedListViewActivity中检查该变量来判断是否已重新创建该流程。

    < / LI>
  2. 检查是否已在onCreate() FeedListViewActivity中重新创建了该流程,如果是,则只需重定向到您的SplashActivity即可重新启动该应用。

  3. 通过将数据保存到onSaveInstanceState()中的捆绑包来保留数据。在进程被杀死之前,Android会在您的活动上调用此方法,这样您就有机会在以后重新创建活动/进程时保存您可能需要的任何数据。您需要恢复onCreate()和/或onRestoreInstanceState()中的数据。

  4. 将数据保留在文件或SQLlite数据库中。

答案 2 :(得分:0)

您将获得ArrayIndexOutOfBoundsException,因为每次到达最后一个项目时,您都会尝试阅读另外10个记录。

但假设您的数组 50条记录。当你达到50时,你将再次阅读新的 10条记录表示51-60

这是不可用的,这就是你获得异常的原因

onLastItemReached(){
    if(totalDispayed < yourArray.length())   <-----
    getNextten();
}

你需要实现像我上面提到的那样