Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OutOfMemory:回收图像_Android_Eclipse_Image_Bitmap_Recycle - Fatal编程技术网

Android OutOfMemory:回收图像

Android OutOfMemory:回收图像,android,eclipse,image,bitmap,recycle,Android,Eclipse,Image,Bitmap,Recycle,我制作了一本相册。我有70个活动,每个人都有一张图片(jpeg,png)。还有两支来回的箭。图像保存在drawable文件夹中。我知道还有其他方法可以创建相册,但现在我想这样做。由于OutOfMemory错误,应用程序在一段时间后崩溃。它并不总是停在同一点上,但有时在第47次活动之后,另一次在52次活动之后。如果我只将每个图像减少到20KB,那么应用程序运行时不会出现问题。但是图像模糊了。如果图像大小为100KB,则图像清晰,但应用程序崩溃。有人告诉我,我必须回收这些图像,以避免记忆不足。像这样

我制作了一本相册。我有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项活动?有一个图像和两个按钮每一个?是的,我是这样做的。为什么?基本上,这不是一种优雅有效的方法。活动是繁重而复杂的应用程序组件,它们都带有视图,表示呈现给用户的上下文。在您的情况下,您可能只需执行一个活动,就可以使用片段或视图呈现这些图库图像。此外,如果您希望您的应用程序看起来非常好,您应该考虑这些元素之间的转换,而活动之间的转换可能是不可靠的。