Android:java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free
5474 ワード
Androidメモリオーバーフローの解決
リストに追加できます
Android 3.0(API level 11)からAndroidの2 D表示パイプがハードアクセラレータをよりサポートするように設計する.ハードアクセラレータはGPUを用いてViewのcanvas上で実行されるすべての描画操作を担う.
ハードアクセラレータを有効にする最も簡単な方法は、アプリケーション全体に対してハードウェア速度を有効にすることです.標準のviewとDrawableのみを使用する場合、グローバルにハードアクセラレータを有効にすることは負の影響を与えません.しかし、ハードアクセラレータはすべての2 Dペイントでサポートされていないため、これを有効にすると、カスタムペイントに影響を与える可能性があります.問題は常に表示されないか、異常であるか、誤ってピクセルが表示される可能性があります.これらの問題を回避するために、Androidは以下のレベルでハードアクセルを有効または禁止する能力を提供します.
Application
Activity
Window
View
アプリケーションでカスタムペイントを使用する場合は、実際のデバイスでハードアクセラレータを有効にしてテストして問題を特定する必要があります.「サポートされていないペイント操作」の項では、ハードアクセラレータできない既知のペイント操作と、それらを避ける方法について説明します.
ハードアクセラレータの制御
ハードアクセラレータは、次のレベルでそれぞれ制御できます.
Application
Activity
Window
View
Applicationレベルは、manifestファイルに次のプロパティをラベルに追加して、アプリケーション全体にハードアクセラレータを有効にします.
Activityレベルでは、アプリケーションがグローバルにハードアクセラレータを有効にするときに正しく動作しない場合は、個別のactivitiesに対してハードアクセラレータを個別に有効にできます.actityレベルでハードアクセラレータを有効または無効にするには、要素に対してandroid:hardwareAcceleratedプロパティを使用します.次の例では、アプリケーション全体でハードアクセラレータを有効にしますが、activityに対してハードアクセラレータを禁止します.
Windowレベルでより高い粒度の制御が必要な場合は、次のコードを使用してwindowのハードアクセラレータを有効にできます.
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注:Windowsレベルでハードアクセルを禁止することはできません.
Viewlevel
実行時に以下のコードを使用して、個別のViewのハード加速を禁止できます.
myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
注意:現在、Viewレベルでハードアクセラレータを有効にすることはできません.Viewレイヤには、ハードアクセラレータを禁止する以外の機能があります.
Viewがハードアクセルされるかどうかを判定します
あるアプリケーションがハードウェア速度を有効にしたかどうかを知るのに役立つ場合があります.ビューをカスタマイズするなど、特に重要です.最新のパイプラインでサポートされていないカスタムペイントを行う場合、これはもっと重要です.
アプリケーションがハード加速されているかどうかを確認するには、次の2つの方法があります.
View.MisHardwareAccelerated():Viewがハードアクセルのwindowにアタッチされている場合はtrueを返します.
Canvas.IsHardwareAccelerated():Canvasがハード加速されたらtrueに戻る.
描画コードでこれをしなければならない場合はCanvasを使用します.IsHardwareAccelerated()はViewではありません.IsHardwareAccelerated()は、ハードアクセラレータのwindowにviewを付加すると、非ハードウェア速度のCanvasを使用して描画操作を行うことができる.例えば、キャッシュのためにビットマップにviewを描画する.
リストに追加できます
android:hardwareAccelerated="false"
,
android:largeHeap="true"
は仕事のいくつかの状況です.
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
Android 3.0(API level 11)からAndroidの2 D表示パイプがハードアクセラレータをよりサポートするように設計する.ハードアクセラレータはGPUを用いてViewのcanvas上で実行されるすべての描画操作を担う.
ハードアクセラレータを有効にする最も簡単な方法は、アプリケーション全体に対してハードウェア速度を有効にすることです.標準のviewとDrawableのみを使用する場合、グローバルにハードアクセラレータを有効にすることは負の影響を与えません.しかし、ハードアクセラレータはすべての2 Dペイントでサポートされていないため、これを有効にすると、カスタムペイントに影響を与える可能性があります.問題は常に表示されないか、異常であるか、誤ってピクセルが表示される可能性があります.これらの問題を回避するために、Androidは以下のレベルでハードアクセルを有効または禁止する能力を提供します.
Application
Activity
Window
View
アプリケーションでカスタムペイントを使用する場合は、実際のデバイスでハードアクセラレータを有効にしてテストして問題を特定する必要があります.「サポートされていないペイント操作」の項では、ハードアクセラレータできない既知のペイント操作と、それらを避ける方法について説明します.
ハードアクセラレータの制御
ハードアクセラレータは、次のレベルでそれぞれ制御できます.
Application
Activity
Window
View
Applicationレベルは、manifestファイルに次のプロパティをラベルに追加して、アプリケーション全体にハードアクセラレータを有効にします.
Activityレベルでは、アプリケーションがグローバルにハードアクセラレータを有効にするときに正しく動作しない場合は、個別のactivitiesに対してハードアクセラレータを個別に有効にできます.actityレベルでハードアクセラレータを有効または無効にするには、要素に対してandroid:hardwareAcceleratedプロパティを使用します.次の例では、アプリケーション全体でハードアクセラレータを有効にしますが、activityに対してハードアクセラレータを禁止します.
Windowレベルでより高い粒度の制御が必要な場合は、次のコードを使用してwindowのハードアクセラレータを有効にできます.
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注:Windowsレベルでハードアクセルを禁止することはできません.
Viewlevel
実行時に以下のコードを使用して、個別のViewのハード加速を禁止できます.
myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
注意:現在、Viewレベルでハードアクセラレータを有効にすることはできません.Viewレイヤには、ハードアクセラレータを禁止する以外の機能があります.
Viewがハードアクセルされるかどうかを判定します
あるアプリケーションがハードウェア速度を有効にしたかどうかを知るのに役立つ場合があります.ビューをカスタマイズするなど、特に重要です.最新のパイプラインでサポートされていないカスタムペイントを行う場合、これはもっと重要です.
アプリケーションがハード加速されているかどうかを確認するには、次の2つの方法があります.
View.MisHardwareAccelerated():Viewがハードアクセルのwindowにアタッチされている場合はtrueを返します.
Canvas.IsHardwareAccelerated():Canvasがハード加速されたらtrueに戻る.
描画コードでこれをしなければならない場合はCanvasを使用します.IsHardwareAccelerated()はViewではありません.IsHardwareAccelerated()は、ハードアクセラレータのwindowにviewを付加すると、非ハードウェア速度のCanvasを使用して描画操作を行うことができる.例えば、キャッシュのためにビットマップにviewを描画する.