Я создал фотоальбом. У меня есть 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>
Проблема в том, что вы не закончили предыдущие действия, поэтому утилита растрового изображения не помогает. Если вы хотите продолжить реализацию галереи таким образом, вы можете установить изображение в onStart и удалить его в onStop или переопределить кнопку возврата, завершить и отслеживать действия и перезапустить их при нажатии.
Добавьте это в ваш 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>
Прежде всего, вы должны масштабировать свои изображения вниз, это уменьшает объем используемой памяти. Вот хороший учебник по этому вопросу: эффективная загрузка больших растровых изображений
Тогда вы должны иметь только одно изображение, которое отображается внутри вашей памяти. Поэтому, прежде чем запускать новую активность, переработайте свой Bitmap и установите для него значение null, gc позаботится об этом.