首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓:当我在5-10分钟后重新打开应用程序时ArrayIndexOutOfBoundsException

安卓:当我在5-10分钟后重新打开应用程序时ArrayIndexOutOfBoundsException
EN

Stack Overflow用户
提问于 2012-08-29 21:23:28
回答 3查看 360关注 0票数 1

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

我一次填充了这个listView 10个项目。

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

现在,在包含此listView的活动中,我编写了如下内容:

代码语言:javascript
复制
onLastItemReached(){
    getNextten();
}

工作正常。当我从这个listViewActivity转到其他活动时,我设置了标志,这样当按下back时,之前浏览过的所有项目都会保留下来(我的意思是,如果用户向下滚动到100个项目,单击一个项目,然后转到某个活动,然后单击设备后退按钮,他将显示第100个项目,剩下的99个项目不需要再次获取)。

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

代码语言:javascript
复制
ArrayIndexOutOfBoundsException

如果我在1-3分钟内重新打开它,它工作得很好。

对不起,我不能发布任何代码,因为所有的活动大约有800行。

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

编辑:

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

这是我得到的StackTrace,我正在尝试处理unCaughtExceptions:

代码语言:javascript
复制
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)

因此,在查看我的log cat之后,它显示错误在第201行,该行包含:

代码语言:javascript
复制
    Log.d("array of product names", SplashActivity.products_array[0] + "--"
            + SplashActivity.products_array[1]);

这是一个在SplashActivity中填充的数组,并设置为public static

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-29 21:29:17

如果应用程序在后台的时间超过5分钟,请移除其所有数据

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

应用程序崩溃的原因是因为您试图在应用程序实际重新构建ListView之前检索元素。如果应用程序还在内存中,它就能工作,因为一切都还在构建中。如果应用程序被删除,那么列表必须重新构建、重新膨胀或其他任何东西。然后尝试检索元素。

票数 2
EN

Stack Overflow用户

发布于 2012-08-29 22:17:00

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

从日志中看,你的应用程序在试图启动FeedListViewActivity时崩溃了。因为这可能是你的应用程序转到后台时显示的活动,所以看起来Android正在尝试重新创建该活动,这意味着当应用程序在后台时,你的进程被终止了(参见上面的解释)。

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

以下是一些可能的替代方案来处理此问题:

  1. 检查该进程是否已在onCreate() of FeedListViewActivity中重新创建,如果是,则需要重新创建SplashActivity先前为您设置的数据列表。您可以通过以下方法来判断进程是否已重新创建:在进程运行时,将public static boolean变量设置为true;如果进程已在onCreate() of FeedListViewActivity中重新创建,则在FeedListViewActivity.
  2. Check中检查该变量;如果已重新创建,则只需重定向到您的SplashActivity,通过将数据保存到onSaveInstanceState()中的包来启动整个应用程序。Android将在进程终止之前对您的活动调用此方法,以便您有机会在重新创建活动/流程时保存您稍后可能需要的任何数据。您需要恢复onCreate()中的数据和/或onRestoreInstanceState().
  3. Persist文件或SQLlite数据库中的数据。
票数 2
EN

Stack Overflow用户

发布于 2012-08-29 21:26:34

您将获得ArrayIndexOutOfBoundsException,因为每次当您到达最后一项时,您都会尝试多读取10条记录。

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

这就是为什么你会得到异常

代码语言:javascript
复制
onLastItemReached(){
    if(totalDispayed < yourArray.length())   <-----
    getNextten();
}

你需要像我上面提到的那样实现一些东西

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12179005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档