2

私はいくつかの事実に基づいてこの質問を書いています。ガベージ コレクター (GC) を明示的に制御することはできません。そのため、一時停止したアクティビティから GC がいつメモリをフェッチするかを確認する方法もありません。

私が話しているテスト ケース: onCreate メソッドで HashMaps と ArrayLists を含む多くのオブジェクトを割り当てました。それらのいくつかは、ビットマップの参照を格納するために使用されます。現在、ユーザーはホームボタンを押してアクティビティを一時停止しています。他のタスクを長時間実行した後、同じタスクを再開するのを忘れています。そして今、一時停止していたアクティビティに戻ります。

問題は次のとおりです:1) この場合、メモリ GC が最初に取得するものをふりをしたり、想定したりする可能性はありますか?

2) gc はアクティビティ全体をフェッチしますか、それともアイドル オブジェクトと null オブジェクトの一部のみをフェッチしますか?

3) 5 時間から 6 時間ほど経過した後、ユーザーがアクティビティを再開したとします。

4) オブジェクトの一部がガベージ コレクションされている場合は、onResume でそれらを null にチェックするだけで、それらにさらにアクセスするかどうかを判断できます。

5) このような状況でヌル ポインター アクセスを処理する方法。

私はすべての提案を聞きたいです。ご覧いただきありがとうございます。ハッピーコーディング。

4

2 に答える 2

1

私が知っていることから、GC は VM 内のすべてのオブジェクトに対して実行され、オブジェクトへの参照がない場合は削除されます。独自のライフサイクルを持つ Android アクティビティについては少し異なります。
Android が他のアプリ (アクティビティ) 用により多くの RAM を必要とする場合、アクティビティ onSaveInstanceState (Bundle outState)で が呼び出されます。この場所に、必要なものをすべて保存する必要がありますBundle。ユーザーがアクティビティに戻ったら、それらのオブジェクトをonRestoreInstanceState(Bundle savedInstanceState).

編集:例として私のアプリの一部:

public class Window {
    public Window(Bundle bundle) {
        maximized = bundle.getBoolean("maximized", maximized);
        displayed = bundle.getBoolean("displayed", displayed);
        minimized = bundle.getBoolean("minimized", minimized);
        resizable = bundle.getBoolean("resizable", resizable);
        orientation = bundle.getInt("orientation");
    }
    public Bundle bundle() {
        Bundle bundle = new Bundle();
        bundle.putBoolean("maximized", maximized);
        bundle.putBoolean("displayed", displayed);
        bundle.putBoolean("minimized", minimized);
        bundle.putBoolean("resizable", resizable);
        bundle.putInt("orientation", orientation);
        return bundle;
    }
}

そして MainActivity:

public class MainActivity extends Activity {
    ArrayList<Window> windows;
    [...]

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        Bundle[] windowsBundle = new Bundle[windows.size()];
        for(int i=0; i<windowsBundle.length; i++){
            windowsBundle[i] = windows.get(i).bundle();
        }
        savedInstanceState.putParcelableArray("windows", windowsBundle);
    }
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState){
        super.onRestoreInstanceState(savedInstanceState);
        Parcelable[] windowsParcels = savedInstanceState.getParcelableArray("windows");
        Bundle[] windowsBundle = (Bundle[]) Arrays.copyOf(windowsParcels, windowsParcels.length, Bundle[].class);
        windowsParcels = null;
        for(int i=0; i<windowsBundle.length; i++){
            windows.add(new Window(windowsBundle[i]));
        }
    }
}
于 2013-07-07T07:50:44.680 に答える