0

さまざまな画面で構成されるアプリケーションに取り組んでおり、さまざまなレイアウトのさまざまなアクティビティとして設計しています。画面ごとに、オーバーレイの背景として使用される2つの大きな(1536x2048)pngファイルがあります(これらはアルファブレンドされています)。今のところ、アクティビティのレイアウトxmlファイルは次のようなものです。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/backgroundPic0" 
tools:context=".TakvimActivity" >

    <ImageView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@drawable/backgroundPic1" 
     />

</RelativeLayout>

とりあえず、メインのアクティビティから3つの異なるアクティビティに移動することができます。私はこれを簡単にやっています

    Intent intent = new Intent(this, TakvimActivity.class);
    startActivity(intent);

setContentView新しいアクティビティが開始されてメソッドが呼び出されるたびに、背景画像が約24MBのメモリを消費することを認識しています。初めて新しい画面に移動し、メイン画面に戻って2番目の新しいアクティビティに移動すると、メモリ不足の例外が原因でアプリケーションがクラッシュし、「blabla-byte割り当てでメモリ不足」と表示されます。(2番目のアクティビティ遷移、場合によっては3番目の遷移などで正確にクラッシュしないことに注意してください。)アプリケーションから戻ったときに、アプリケーションがリソース(最も重要なのは画像ファイル)を解放しないようです。アクティビティ。現在のアクティビティが適切に破棄されているかどうかを確認しましたonDestroyメソッドと私はそれが適切に呼び出されているのを見ました。ビュー階層への参照が消去されるため、GCは、アクティビティのUI関連のすべてのメモリを破棄する必要がありますか?たとえば、コードに含めなかったアクティビティのメモリをクリアする明示的な方法はありますか?

4

2 に答える 2

1

imageview自体がGCされている場合、問題は解決します。imageview自体でunbindDrawablesを呼び出すには十分ではありません。

ここで私の答えも参照してください

PagerAdapterAndroidLollipopのunbindDrawablesが機能しない

私の似ているがAndroidStudioに焦点を当てた質問はここにあります

参照されていないbyte[]が元々ビットマップからリークされましたが、recycled()によりメモリリークが発生しました(アクティビティが停止するまで)

于 2016-01-26T10:24:17.613 に答える
0

次のメソッドをアプリケーションに追加して、アクティビティから呼び出してみてください。

private void unbindDrawables(View view) {
    try
    {
        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();
          }         
        }
    catch(Exception e)
    {
        e.printStackTrace();            
    }

}

@Override
protected void onDestroy()
{
super.onDestroy();
//R.id.LayoutId is the id of the root layout of your activity   
unbindDrawables(findViewById(R.id.LayoutId)); 
    System.gc();

}
于 2013-03-25T15:13:35.947 に答える