Я пытаюсь размыть некоторые изображения 1024x1024, и иногда я получаю java.lang.OutOfMemoryError и я не знаю почему
Я тестирую прямо на своем планшете Android 4.1.2, и у меня всегда 1,5 ГБ памяти бесплатно.
Вот класс, который я использую:
package com.example.playerclient.blur;
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v8.renderscript.*;
public class BlurBuilder {
private static final float BITMAP_SCALE = 0.6f;
public static Bitmap blur(Context context, Bitmap image, float blurRadius) {
Bitmap outputBitmap = null;
if (image != null) {
if (blurRadius == 0) {
return image;
}
if (blurRadius < 1) {
blurRadius = 1;
}
if (blurRadius > 25) {
blurRadius = 25;
}
int width = Math.round(image.getWidth() * BITMAP_SCALE);
int height = Math.round(image.getHeight() * BITMAP_SCALE);
Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false);
outputBitmap = Bitmap.createBitmap(inputBitmap);
RenderScript rs = RenderScript.create(context);
ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
theIntrinsic.setRadius(blurRadius);
theIntrinsic.setInput(tmpIn);
theIntrinsic.forEach(tmpOut);
tmpOut.copyTo(outputBitmap);
}
return outputBitmap;
}
}
Вот где я вызываю метод:
public class MusicaActivity extends AppCompatActivity implements View.OnClickListener {
// Others methods here.
private void mostraDadosMusica() {
Intent intent = getIntent();
Musica musica = (Musica)intent.getSerializableExtra(MainActivity.VISUALIZA_PLAYER);
// Where i'm having problems.
Bitmap originalBmp = BitmapFactory.decodeResource(getResources(), musica.getAlbum().getIdCapa());
Bitmap resultBmp = BlurBuilder.blur(this, originalBmp, 15f);
backgroundImageView.setImageBitmap(resultBmp);
}
}
И вот сообщение об исключении:
11-04 22: 05: 07.453 18928-18928 / com.example.playerclient E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное
java.lang.OutOfMemoryError
на android.graphics.BitmapFactory.nativeDecodeAsset (собственный метод)
на android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:636)
на android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:484)
на android.graphics.BitmapFactory.decodeResource (BitmapFactory.java:512)
на android.graphics.BitmapFactory.decodeResource (BitmapFactory.java:542)
в com.example.playerclient.activity.MusicaActivity.mostraDadosMusica (MusicaActivity.java:48)
в com.example.playerclient.activity.MusicaActivity.onCreate (MusicaActivity.java:87)
на android.app.Activity.performCreate (Activity.java:5188)
на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1094)
на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2074)
на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2135)
на android.app.ActivityThread.access $ 700 (ActivityThread.java:140)
на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1237)
на android.os.Handler.dispatchMessage (Handler.java:99)
на android.os.Looper.loop (Looper.java:137)
на android.app.ActivityThread.main (ActivityThread.java:4921)
в java.lang.reflect.Method.invokeNative (родной метод)
в java.lang.reflect.Method.invoke (Method.java:511)
на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1038)
на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:805)
at dalvik.system.NativeStart.main (собственный метод)