如何清除内存以防止java.lang.OutOfMemoryError

如何清除内存以防止java.lang.OutOfMemoryError,java,android,out-of-memory,Java,Android,Out Of Memory,我有一个包含很多页面的应用程序,每个页面都有自己的图像,这些图像是通过异步任务从web加载的。问题是,当您打开和关闭许多页面时,一段时间后会出现outofmemory错误。如何在离开活动时从内存中清除图像以防止出现这种情况 此任务将加载图像: private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { ImageView bmImage; public Downl

我有一个包含很多页面的应用程序,每个页面都有自己的图像,这些图像是通过异步任务从web加载的。问题是,当您打开和关闭许多页面时,一段时间后会出现outofmemory错误。如何在离开活动时从内存中清除图像以防止出现这种情况

此任务将加载图像:

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImageTask(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mIcon11 = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon11 = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mIcon11;
        }

        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }
此活动以不同的值和不同的图像打开和关闭。打开此活动的某些实例后,会出现以下outofmemory错误:

07-24 16:37:57.870  27717-28014/com.yigitserin.hsboard E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:299)
            at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:856)
     Caused by: java.lang.OutOfMemoryError
            at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
            at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:650)
            at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:722)
            at com.yigitserin.hsboard.HeroActivity$DownloadImageTask.doInBackground(HeroActivity.java:137)
            at com.yigitserin.hsboard.HeroActivity$DownloadImageTask.doInBackground(HeroActivity.java:125)
            at android.os.AsyncTask$2.call(AsyncTask.java:287)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:856)

如何在用户退出此活动的一个实例后从内存中删除图像?

在我看来,您必须使用第三方库,如:-


以上库自动维护位图内存。

我认为您必须使用第三方库,如:-


以上库自动维护位图内存。

我认为您必须使用第三方库,如:-


以上库自动维护位图内存。

我认为您必须使用第三方库,如:-


上面的lib自动维护位图内存。

您需要调用位图的回收方法,例如在Actives onDestroy/onStop方法中


请参见

您需要为位图调用回收方法,例如在activies onDestroy/onStop方法中


请参见

您需要为位图调用回收方法,例如在activies onDestroy/onStop方法中


请参见

您需要为位图调用回收方法,例如在activies onDestroy/onStop方法中


请参见

我认为您应该在finally block中关闭流,然后再试一次。我希望这可以排除一种可能性,然后我们可以考虑其他优化技术。

我认为您应该在finally block中关闭流,然后再试一次。我希望这可以排除一种可能性,然后我们可以考虑其他优化技术。

我认为你应该在finally block中关闭流,然后再试一次。我希望这可以排除一种可能性,然后我们可以考虑其他优化技术。

我认为你应该在finally block中关闭流,然后再试一次。我希望这可以排除一种可能性,然后我们可以考虑其他优化技术。

您可能不需要“清除”内存,而是对正在加载的
位图进行下采样,以避免内存不足异常。有一些关于如何处理和加载大型位图文件的介绍。例如:

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
    int reqWidth, int reqHeight) {

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
在这里,您可以在加载到内存之前缩小图像的比例,而不是加载整个位图,从而完全避免此问题

如果您仍然遇到这个问题,我会很快关心为什么您的应用程序保留了对许多不再使用的图像的引用。当页面被破坏时,如果应用程序设置正确,位图应该像其他任何东西一样被垃圾收集

您可能不需要“清除”内存,而是对正在加载的
位图进行下采样,以避免内存不足异常。有一些关于如何处理和加载大型位图文件的介绍。例如:

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
    int reqWidth, int reqHeight) {

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
在这里,您可以在加载到内存之前缩小图像的比例,而不是加载整个位图,从而完全避免此问题

如果您仍然遇到这个问题,我会很快关心为什么您的应用程序保留了对许多不再使用的图像的引用。当页面被破坏时,如果应用程序设置正确,位图应该像其他任何东西一样被垃圾收集

您可能不需要“清除”内存,而是对正在加载的
位图进行下采样,以避免内存不足异常。有一些关于如何处理和加载大型位图文件的介绍。例如:

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
    int reqWidth, int reqHeight) {

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
在这里,您可以在加载到内存之前缩小图像的比例,而不是加载整个位图,从而完全避免此问题

如果您仍然遇到这个问题,我会很快关心为什么您的应用程序保留了对许多不再使用的图像的引用。当页面被破坏时,如果应用程序设置正确,位图应该像其他任何东西一样被垃圾收集

您可能不需要“清除”内存,而是对正在加载的
位图进行下采样,以避免内存不足异常。有一些关于如何处理和加载大型位图文件的介绍。例如:

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
    int reqWidth, int reqHeight) {

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
在这里,您可以在加载到内存之前缩小图像的比例,而不是加载整个位图,从而完全避免此问题


如果您仍然遇到这个问题,我会很快关心为什么您的应用程序保留了对许多不再使用的图像的引用。当页面被破坏时,如果应用程序设置正确,位图应该像其他任何东西一样被垃圾收集

现在使用毕加索,我认为是图像视图的最佳库。现在使用毕加索,我认为是图像视图的最佳库。现在使用毕加索,我认为是图像视图的最佳库。现在使用毕加索,我认为是图像视图的最佳库。