OutOfMemory: переработка изображений

1

Я создал фотоальбом. У меня есть 70 видов деятельности, и у всех есть одно изображение (jpeg, png). И две стрелы, чтобы идти взад и вперед. Изображения сохраняются в папке с возможностью рисования. Я знаю, что есть другие способы создания фотоальбома, но теперь я хочу сделать это именно так. Приложение аварийно завершает работу из-за ошибки OutOfMemory-Error. Он не всегда останавливается в одной точке, но иногда после 47-й активности, в другое время после 52 занятий. Если я уменьшу каждое изображение только до 20 КБ, приложение будет работать без проблем. Но изображения размыты. Если изображения 100 КБ, они резкие, но приложение падает. Кто-то сказал мне, что я должен переработать Изображения, чтобы быть не из памяти. Как это:

if (bitmap != null) {
    bitmap.recycle();
    bitmap = null;
} 

Но я не знаю, как это сделать. Это мой код:

     public class Picture1 extends Activity {

            public ImageView iv; 

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.pic1);

               iv = (ImageView)findViewById(R.id.imageView1);}

               public void Menue (View view){
            Intent i = new Intent(this, MainActivity.class);             
            startActivity(i);
            finish();}

               public void Pic0 (View view){
            Intent i = new Intent(this, Picture0.class);             
            startActivity(i);
            finish();

}

               public void Pic2 (View view){
            Intent i = new Intent(this, Picture2.class);             
            startActivity(i);
            finish();


}}

XML-код:

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

         <ImageView
            android:id="@+id/imageView1"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_centerInParent="true"
            android:layout_marginLeft="14dp"
            android:src="@drawable/picture1" />

        <ImageView
            android:id="@+id/imageView4"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:src="@drawable/arrowright" 
            android:onClick="Pic2"/>

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="100dp"
            android:layout_height="80dp"
            android:layout_alignTop="@+id/imageView3"
            android:layout_centerHorizontal="true"
            android:onClick="Menue"
            android:src="@drawable/Menue" />

        <ImageView
            android:id="@+id/imageView4"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:src="@drawable/arrowleft" 
            android:onClick="Pic0"/>


         </RelativeLayout>
  • 0
    подождите ... у вас есть 70 мероприятий? с одним изображением и двумя кнопками каждая из них?
  • 0
    Да, я так и сделал. Почему?
Показать ещё 1 комментарий
Теги:
image
bitmap

3 ответа

2
Лучший ответ

Проблема в том, что вы не закончили предыдущие действия, поэтому утилита растрового изображения не помогает. Если вы хотите продолжить реализацию галереи таким образом, вы можете установить изображение в onStart и удалить его в onStop или переопределить кнопку возврата, завершить и отслеживать действия и перезапустить их при нажатии.

  • 0
    Я не понимаю этого на самом деле. У вас есть ссылка, где это описано?
  • 0
    Когда вы вызываете startActivity (i); Вы запускаете еще одну копию своей деятельности, это означает, что вы сохраняете все свои предыдущие действия с растровыми изображениями и т. д. в памяти. Вам следует вызвать финиш, чтобы уничтожить вашу активность и освободить ресурсы.
Показать ещё 11 комментариев
1

Добавьте это в ваш XML файл AndroidMainfest:

android:hardwareAccelerated="false"
android:largeHeap="true"

внутри тега аппликатора:

<application
        android:hardwareAccelerated="false"
        android:largeHeap="true"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
0

Прежде всего, вы должны масштабировать свои изображения вниз, это уменьшает объем используемой памяти. Вот хороший учебник по этому вопросу: эффективная загрузка больших растровых изображений

Тогда вы должны иметь только одно изображение, которое отображается внутри вашей памяти. Поэтому, прежде чем запускать новую активность, переработайте свой Bitmap и установите для него значение null, gc позаботится об этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню