在我的应用程序中,我有一个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
。
答案 0 :(得分:2)
如果应用在后台超过5分钟,则删除其所有数据
这实际上可能在1分钟内发生。它只是依赖于系统运行的环境。当您按下主页按钮(或顶部活动的后退按钮)时,系统会将您的应用程序置于休眠模式。它会将其保留在内存中,直到需要内存为止。这允许用户在他们想要快速切换并返回的事件中快速返回到它。几分钟后,如果用户打开游戏或其他东西,操作系统可能会决定从内存中擦除应用程序。在这种情况下,当用户重新打开您的应用程序时,您必须从头开始重建所有内容。
您的应用崩溃的原因是您在应用实际重建ListView之前尝试检索该元素。如果应用程序仍然在内存中,它可以工作,因为一切仍然是内置的。如果删除了应用程序,则必须重建列表,重新充气或其他任何内容。然后你尝试检索元素。
答案 1 :(得分:2)
当你的应用程序在后台时,Android可以随时终止它(只需杀死你的活动正在运行的进程)。如果用户想要返回到您的应用,Android会为您的应用创建一个新流程,然后重新创建仅活动堆栈顶部的活动(即:显示的时间你的应用程序转到后台)。
从日志中看,您尝试启动FeedListViewActivity
时应用程序崩溃了。由于这可能是您的应用程序进入后台时显示的活动,因此Android似乎正在尝试重新创建活动,这意味着您的进程在应用程序处于后台时被杀死(请参阅上面的说明)。 / p>
您说您尝试访问的数据是由SplashActivity
设置的,并保存在静态变量中。问题是,当Android为您创建新流程时,它只会重新创建顶级活动,而不是重新创建其下的所有活动。它不会重新创建SplashActivity
,因此尚未初始化变量。
以下是一些可能的替代方案:
检查是否已在onCreate()
FeedListViewActivity
中重新创建了该流程,如果是,则需要重新创建SplashActivity
之前设置的数据列表为你服务。您可以通过SplashActivity
在运行时将public static boolean
变量设置为true
并在FeedListViewActivity
中检查该变量来判断是否已重新创建该流程。
检查是否已在onCreate()
FeedListViewActivity
中重新创建了该流程,如果是,则只需重定向到您的SplashActivity
即可重新启动该应用。
通过将数据保存到onSaveInstanceState()
中的捆绑包来保留数据。在进程被杀死之前,Android会在您的活动上调用此方法,这样您就有机会在以后重新创建活动/进程时保存您可能需要的任何数据。您需要恢复onCreate()
和/或onRestoreInstanceState()
中的数据。
将数据保留在文件或SQLlite数据库中。
答案 2 :(得分:0)
您将获得ArrayIndexOutOfBoundsException
,因为每次到达最后一个项目时,您都会尝试阅读另外10个记录。
但假设您的数组 50条记录。当你达到50时,你将再次阅读新的 10条记录。 表示51-60
这是不可用的,这就是你获得异常的原因
onLastItemReached(){
if(totalDispayed < yourArray.length()) <-----
getNextten();
}
你需要实现像我上面提到的那样