1

私のアプリケーションにはlistViewがあります。

この listView に一度に 10 個の項目を入力しました。

そのため、spalsh 画面を表示しているときに、バックグラウンドで最初の 10 項目をフェッチします。スプラッシュ画面が消えると、ユーザーは最初の 10 個の項目を見ることができます。

このlistViewを含むアクティビティで、次のようなものを書きました:

onLastItemReached(){
    getNextten();
}

正常に動作します。そして、このlistViewActivityから別のアクティビティに行くときは、フラグを設定して、それまでに閲覧したすべてのアイテムが戻るときに保持されるようにします(つまり、ユーザーが100アイテムまでスクロールして1つのアイテムをクリックし、いくつかのアクティビティに行き、デバイスの戻るボタンをクリックすると、100 番目のアイテムが表示され、残りの 99 アイテムは再度取得する必要はありません)

問題は、アプリケーションを閉じて、5〜10分後に開くと、次のように言ってクラッシュすることです。

ArrayIndexOutOfBoundsException

1〜3分で再度開くと、正常に動作します。

申し訳ありませんが、すべてのアクティビティに約 800 行あるため、コードを投稿できません。

なぜこの例外が常に発生するのか、誰もが知っています。私が知りたいことの1つは、次のようなものはありますか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)

ログ cat を見ると、エラーは 201 行目にあり、その行には次の内容が含まれています。

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

これは、SplashActivity に取り込まれ、作成された配列public staticです。

4

3 に答える 3

2

アプリが5分以上バックグラウンドにある場合は、すべてのデータを削除します

これは実際には1分以内に発生する可能性があります。これは、システムが実行されている環境に依存します。ホームボタン(または上部のアクティビティの戻るボタン)を押すと、システムはアプリを休止状態のモードにします。そのメモリが必要になるまで、メモリに保持されます。これにより、ユーザーは、実際にすばやく切り替えて戻りたい場合に、すぐにそれに戻ることができます。ただし、数分後、ユーザーがゲームなどを開いた場合、OSはアプリをメモリからワイプすることを決定する場合があります。この場合、ユーザーがアプリを再度開いたときに、すべてを最初から再構築する必要があります。

アプリがクラッシュする理由は、アプリが実際にListViewを再構築する前に要素を取得しようとしているためです。アプリがまだメモリ内にある場合は、すべてがまだビルドされているため、機能します。アプリが削除された場合は、リストを再構築したり、再膨張させたりする必要があります。次に、要素を取得しようとします。

于 2012-08-29T13:29:17.447 に答える
2

アプリがバックグラウンドにある場合、Android はいつでも (アクティビティが実行されているプロセスを強制終了するだけで) アプリを強制終了できます。その後、ユーザーがアプリに戻りたい場合、Android はアプリの新しいプロセスを作成し、アクティビティ スタックの一番上にあったアクティビティ(つまり、アプリがバックグラウンドに移行したときに表示されていたアクティビティ) のみを再作成します。 .

ログから、アプリを起動しようとするとクラッシュするようですFeedListViewActivity。これはおそらくアプリがバックグラウンドに移行したときに表示されていたアクティビティであるため、Android がアクティビティを再作成しようとしているように見えます。これは、アプリがバックグラウンドにある間にプロセスが強制終了されたことを意味します (上記の説明を参照)。

アクセスしようとしているデータはSplashActivity、静的変数によって設定され、保持されていると言います。問題は、Android が新しいプロセスを作成するときに、その下のすべてのアクティビティではなく、最上位のアクティビティのみを再作成することです。を再作成しないSplashActivityため、変数がまだ初期化されていません。

これに対処するためのいくつかの可能な代替手段を次に示します。

  1. でプロセスが再作成されたかどうかを確認します。再作成された場合onCreate()は、以前に設定したFeedListViewActivityデータのリストを再作成する必要があります。実行時に変数を設定し、その変数を で確認することでSplashActivity、プロセスが再作成されたかどうかを確認できます。SplashActivitypublic static booleantrueFeedListViewActivity

  2. プロセスがonCreate()ofで再作成されたかどうかを確認し、再作成されたFeedListViewActivity場合は、アプリケーションにリダイレクトしてSplashActivity最初からやり直してください。

  3. のバンドルにデータを保存して永続化しonSaveInstanceState()ます。Android は、プロセスが強制終了される前にアクティビティでこのメソッドを呼び出すため、後でアクティビティ/プロセスが再作成されたときに必要になる可能性のあるデータを保存する機会があります。onCreate()および/またはのデータを復元する必要がありますonRestoreInstanceState()

  4. ファイルまたは SQLlite データベースにデータを永続化します。

于 2012-08-29T14:16:59.520 に答える
0

ArrayIndexOutOfBoundsException最後のアイテムに到達するたびに、さらに 10 個のレコードを読み取ろうとしているためです。

しかし、配列に50 個のレコードがあるとします。50 に達すると、再び新しい10 レコードを読み取ることになります。それは51-60を意味します

利用できないため、例外が発生しています

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

上記のようなものを実装する必要があります

于 2012-08-29T13:26:33.610 に答える