Android OutOfMemory:回收图像
我制作了一本相册。我有70个活动,每个人都有一张图片(jpeg,png)。还有两支来回的箭。图像保存在drawable文件夹中。我知道还有其他方法可以创建相册,但现在我想这样做。由于OutOfMemory错误,应用程序在一段时间后崩溃。它并不总是停在同一点上,但有时在第47次活动之后,另一次在52次活动之后。如果我只将每个图像减少到20KB,那么应用程序运行时不会出现问题。但是图像模糊了。如果图像大小为100KB,则图像清晰,但应用程序崩溃。有人告诉我,我必须回收这些图像,以避免记忆不足。像这样:Android OutOfMemory:回收图像,android,eclipse,image,bitmap,recycle,Android,Eclipse,Image,Bitmap,Recycle,我制作了一本相册。我有70个活动,每个人都有一张图片(jpeg,png)。还有两支来回的箭。图像保存在drawable文件夹中。我知道还有其他方法可以创建相册,但现在我想这样做。由于OutOfMemory错误,应用程序在一段时间后崩溃。它并不总是停在同一点上,但有时在第47次活动之后,另一次在52次活动之后。如果我只将每个图像减少到20KB,那么应用程序运行时不会出现问题。但是图像模糊了。如果图像大小为100KB,则图像清晰,但应用程序崩溃。有人告诉我,我必须回收这些图像,以避免记忆不足。像这样
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>
问题在于您没有完成以前的活动,这就是为什么回收位图没有帮助。如果您想继续以这种方式实施gallery,您可以在onStart中设置图像,并在onStop中删除它,或覆盖“后退”按钮,完成并跟踪您的活动,并在按下“后退”按钮时重新启动它们。首先,您应该缩小图像的比例,这会减少所用的内存量。以下是一个很好的教程:
那么你应该只有一张图片显示在你的记忆中。因此,在启动新活动之前,请回收位图并将其设置为null,gc将处理该位图。将其添加到您的AndroidMainfest.xml文件中:
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>
我真的不明白。你有没有一个链接描述了这一点?当你称之为startActivity(i);您启动活动的另一个副本,这意味着您将使用位图等存储在内存中以前的所有活动。你应该调用finish来销毁你的活动并释放资源。好的,所以我必须完成所有活动。是s.th。使用onDestroy?我知道您不想更改当前的实现,但使用ViewPagerNo会更简单,如果您不完成活动,在启动另一个活动后完成它,或者只是在当前活动中更改图片,则不会调用onDestroy等待。。。你有70项活动?有一个图像和两个按钮每一个?是的,我是这样做的。为什么?基本上,这不是一种优雅有效的方法。活动是繁重而复杂的应用程序组件,它们都带有视图,表示呈现给用户的上下文。在您的情况下,您可能只需执行一个活动,就可以使用片段或视图呈现这些图库图像。此外,如果您希望您的应用程序看起来非常好,您应该考虑这些元素之间的转换,而活动之间的转换可能是不可靠的。