0

アクティビティの1つで戻るボタンを押したときに、前のアクティビティに戻りたいのですが、その前に、メモリ内のすべてのビットマップとその他のリソースを最初に削除する必要があります。そうしないと、メモリ不足エラーが発生します。

私は試した:

public void onBackPressed() {
   bitmap.recycle();
   System.gc();
   Runtime.getRuntime().gc();
   Intent intent = new Intent(this,GameActivity.class);
   this.startActivity(intent);
}

しかし、それでもメモリ不足エラーが発生します。

4

4 に答える 4

0

前のアクティビティで書いた

@Override
public void onStop() {
    super.onStop();
 unbidDrawables and recycle bitmaps
}

@Override
public void onRestart(){
    onCreate(new Bundle());
}

それはその場しのぎの仕事のようなものですが、うまくいきます!

于 2013-02-26T15:41:49.357 に答える
0

gc() を呼び出しても、収集できないアクティビティ内のオブジェクトへの参照がまだあります。メモリの問題がアクティビティで宣言された一部のオブジェクトに関連している場合は、それらの参照を null に変更し、gc() を呼び出してみてください。大きなキャッシュを保持している場合は、WeakReference を使用してみてください。もちろん、パフォーマンスは低下しますが、クラッシュすることはありません

取得している動作は、設計上の欠陥のように見えます。アプリはメモリを使いすぎており、現在テストしているデバイスで動作する場合でも、他のデバイスで問題が発生する可能性があります. System.gc() は、実行しても何も保証されないため、通常は OS によってのみ呼び出されます。

于 2013-02-26T09:58:17.777 に答える
0

戻るボタンを押してこれを呼び出します:-

private void unbindDrawables(View view) {
     Log.d(TAG,"in unbindDrawables");
        if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
        ((ViewGroup) view).removeAllViews();
        view.setBackgroundResource(0);
        Log.d(TAG,"removed views");
        //finish();   

        }
 }
于 2013-02-26T10:00:43.780 に答える
0

オーバーライドしないonBackPressed()

オーバーライドonStop()

@Override    
protected void onStop() {
    super.onStop();
    bitmap.recycle(); //PUT THE ACTUAL BITMAP THAT YOU WANT TO RECYCLE HERE !!!!!!!
    System.gc();
    Runtime.getRuntime().gc();
    Intent intent = new Intent(this,GameActivity.class);
    startActivity(intent);
}
于 2013-02-26T09:59:11.693 に答える