Android: java.lang.OutOfMemoryError:

Я разработал приложение, которое использует большое количество изображений на Android.

Есть много изображений, присутствующих в папке с возможностью выбора, более 100, я разрабатываю приложение для анимации изображений. Я использовал изображение для отображения изображений GIF. Я использовал концепцию изображений Split GIF в несколько изображений в формате PNG, а затем использовал его.

Каждый раз, когда пользователь входит в приложение, я вижу, что память растет все больше и больше, пока пользователь не получит java.lang.OutOfMemoryError .

Итак, каков наилучший / правильный способ обработки многих изображений?

Ниже мой код:

dog_animation.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/DogView" android:orientation="vertical" > <ImageView android:id="@+id/dog_animation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.19" /> 

Dog_animation.xml (папка для рисования)

 <?xml version="1.0" encoding="utf-8"?> 

 <item android:drawable="@drawable/image" android:duration="50"/> <item android:drawable="@drawable/image1" android:duration="50"/> <item android:drawable="@drawable/image2" android:duration="50"/> <item android:drawable="@drawable/image3" android:duration="50"/> <item android:drawable="@drawable/image4" android:duration="50"/> <item android:drawable="@drawable/image5" android:duration="50"/> <item android:drawable="@drawable/image6" android:duration="50"/> <item android:drawable="@drawable/image7" android:duration="50"/> <item android:drawable="@drawable/image8" android:duration="50"/> <item android:drawable="@drawable/image9" android:duration="50"/> <item android:drawable="@drawable/image10" android:duration="50"/> <item android:drawable="@drawable/image11" android:duration="50"/> <item android:drawable="@drawable/image12" android:duration="50"/> <item android:drawable="@drawable/image13" android:duration="50"/> <item android:drawable="@drawable/image14" android:duration="50"/> <item android:drawable="@drawable/image15" android:duration="50"/> <item android:drawable="@drawable/image16" android:duration="50"/> <item android:drawable="@drawable/image17" android:duration="50"/> <item android:drawable="@drawable/image18" android:duration="50"/> <item android:drawable="@drawable/image19" android:duration="50"/> <item android:drawable="@drawable/image20" android:duration="50"/> <item android:drawable="@drawable/image21" android:duration="50"/> <item android:drawable="@drawable/image22" android:duration="50"/> <item android:drawable="@drawable/image23" android:duration="50"/> <item android:drawable="@drawable/image24" android:duration="50"/> <item android:drawable="@drawable/image25" android:duration="50"/> <item android:drawable="@drawable/image26" android:duration="50"/> <item android:drawable="@drawable/image27" android:duration="50"/> <item android:drawable="@drawable/image28" android:duration="50"/> <item android:drawable="@drawable/image29" android:duration="50"/> <item android:drawable="@drawable/image30" android:duration="50"/> <item android:drawable="@drawable/image31" android:duration="50"/> <item android:drawable="@drawable/image32" android:duration="50"/> <item android:drawable="@drawable/image33" android:duration="50"/> <item android:drawable="@drawable/image34" android:duration="50"/> <item android:drawable="@drawable/image35" android:duration="50"/> <item android:drawable="@drawable/image36" android:duration="50"/> <item android:drawable="@drawable/image37" android:duration="50"/> <item android:drawable="@drawable/image38" android:duration="50"/> <item android:drawable="@drawable/image39" android:duration="50"/> <item android:drawable="@drawable/image40" android:duration="50"/> <item android:drawable="@drawable/image41" android:duration="50"/> <item android:drawable="@drawable/image42" android:duration="50"/> <item android:drawable="@drawable/image43" android:duration="50"/> <item android:drawable="@drawable/image44" android:duration="50"/> <item android:drawable="@drawable/image45" android:duration="50"/> <item android:drawable="@drawable/image46" android:duration="50"/> <item android:drawable="@drawable/image47" android:duration="50"/> <item android:drawable="@drawable/image48" android:duration="50"/> <item android:drawable="@drawable/image49" android:duration="50"/> <item android:drawable="@drawable/image50" android:duration="50"/> <item android:drawable="@drawable/image51" android:duration="50"/> <item android:drawable="@drawable/image52" android:duration="50"/> <item android:drawable="@drawable/image53" android:duration="50"/> <item android:drawable="@drawable/image54" android:duration="50"/> <item android:drawable="@drawable/image55" android:duration="50"/> <item android:drawable="@drawable/image56" android:duration="50"/> 

Dog_Animation.java

 public class Dog_Animation extends Activity { Timer timer = new Timer(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.dog_animation); ImageView img = (ImageView) findViewById(R.id.dog_animation); img.setBackgroundResource(R.drawable.dog_animation); AnimationDrawable frameAnimation = (AnimationDrawable) img .getBackground(); frameAnimation.start(); timer.schedule(new TimerTask() { public void run() { Intent intent = new Intent(Dog_Animation.this, Man_Animation.class); startActivity(intent); } }, 10000); } } 

Теперь проблема заключается в том, когда я пытаюсь перейти от одного действия к другому, у которого есть такое же другое изображение, чтобы оживить его, давая мне ошибку java.lang.OutOfMemory .

Я пробовал так много разных решений, как

 @Override protected void onDestroy() { super.onDestroy(); unbindDrawables(findViewById(R.id.DogView)); 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(); } } 

И так далее, но любое решение для меня не работает. Пожалуйста, помогите мне решить эту проблему. Даже я упомянул http://androidactivity.wordpress.com/2011/09/24/solution-for-outofmemoryerror-bitmap-size-exceeds-vm-budget/ эту ссылку, но не решая проблему.

Solutions Collecting From Web of "Android: java.lang.OutOfMemoryError:"

В вашем AndroidManifest.xml сохраните этот тег внутри приложения, добавьте largeHeap следующим образом:

 <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:largeHeap="true"/> 

Заменить:

 img.setBackgroundResource(R.drawable.dog_animation); 

От:

 img.setImageBitmap(decodeSampleBitmapFromResource(R.drawable.dog_animation, width, height)); //dont forget to replace width and heigh by your imageview dimension 

Добавление:

 public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; } 

а также

 public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); } 

Это от: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Попробуйте остановить анимацию на onPause (). Из-за этого существует большая вероятность того, что он не получит GCED. Также оптимизируйте растровые изображения ur с помощью этого сайта http://tinypng.org , если вам не нужен альфа-слой, установите его на 24 бит

В приведенном выше ответе отсутствует getResources()

 img.setImageBitmap(decodeSampleBitmapFromResource(R.drawable.dog_animation, width, height)); 

Поэтому он становится

 img.setImageBitmap(decodeSampleBitmapFromResource(getResources(), R.drawable.dog_animation, width, height)); 
 try { //Code here that cause OutOfMemoryError } catch (Error ee) { ee.printStacktrace(); }