0

タブレット (1024x768) 用の Android アプリケーションを開発しています。ここでいくつかの解決策を検索して見つけましたが、誰もが問題を解決してくれました。アプリケーションには 5 つの画面があり、各画面には読み込む ImageView があります。

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="1024dp"
    android:layout_height="768dp"
    android:layout_centerHorizontal="TRUE"
    android:src="@drawable/scene1"
    />

最初の画面と 2 番目の画面は適切に読み込まれますが、3 番目の画面を読み込もうとすると、次のエラーが発生します (startActivity によって読み込まれるすべての画面はそのレイアウトです。別の順序で読み込むと、レイアウト エラーではありません。 、2 つと 3 つ目のクラスもロードできます):

05-28 17:03:51.774: E/AndroidRuntime(401): java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown>

05-28 17:03:51.774: E/AndroidRuntime(401): Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown>


05-28 17:03:51.774: E/AndroidRuntime(401): Caused by: java.lang.reflect.InvocationTargetException


05-28 17:03:51.774: E/AndroidRuntime(401): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

私はいくつかのことを試しました:

 @Override
  public void onPause()
  {
    super.onPause();
    Log.i("URI", "Syste.gc");
    // yada yada yada...

    System.gc();
  }

@Override
protected void onDestroy()
{
    super.onDestroy();

    unbindDrawables(findViewById(R.id.RootView));
    System.gc();
}

private void unbindDrawables(View view)
{
    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();
    }
}

しかし、私は常にエラーが発生します。

画像は PNG で、その重量は 50k 未満です。

助言がありますか?

ありがとう!

4

3 に答える 3

1

1024x768 は DP の寸法であり、ピクセル数は高解像度デバイスの最大 2 倍になる可能性があります。

bitmapfactory を使用して 1024x768 の画像をデコードすると、密度に応じてビットマップがスケーリングされるため、最終的に 2048x1536 の画像になり、12MB 程度を占めることになります。

デバイスの解像度に関係なく、画像を常に同じ解像度にしたい場合は、Drawable-nodpiフォルダーに入れると、デコード時にサイズが変更されません。

于 2012-05-28T15:51:49.247 に答える
1

XML からイメージをロードするのではなく、onCreate() メソッドでイメージをロードしてみてください。

最初に画像のサイズとタイプを読み取ってから、その画像の縮小バージョンを読み込もうとしましたか?

Android 開発者リソースが示唆するように。

于 2012-05-28T15:52:47.533 に答える
0

まず、System.gc()を呼び出しても、ガベージコレクターは実際には合格しません。また、パフォーマンスが大幅に低下する可能性があるため、これほど広く使用することは控えておきます。ガベージコレクターで画像をクリーンアップする場合は、代わりにWeakReferencesを使用して、画像をHashMapに保存します。

次に、VMがすぐに崩壊するため、小さいイメージを使用してみてください。

于 2012-05-28T15:28:09.580 に答える