Подтвердить что ты не робот

Canvas: попытка использования переработанного растрового андроида

Я постоянно сталкиваюсь с этой проблемой, и я не знаю, что с этим делать.

Я использовал эту библиотеку, и когда я получаю обрезанное изображение, я сохраняю его в статической переменной и перехожу к следующему действию. Когда я прихожу в следующую операцию, я ссылаюсь на статическую переменную, чтобы получить растровое изображение и попытаться его масштабировать. Но это дает мне ошибку.

Вот что я делаю.

public void buttonCropClick(View view) throws IOException
{
    imageView.setDrawingCacheEnabled(true);
    imageView.buildDrawingCache(true);
    Snapshot.CroppedBitmap = imageView.getDrawingCache(true);
    imageView.setDrawingCacheEnabled(false);
    startActivity(new Intent(this,RecommendationInfo.class));
}

в классе RecommendationInfo, я получаю растровое изображение в следующей строке Snapshot.CroppedBitmap = imageView.getDrawingCache(true);, затем сохраняю это растровое изображение в статической переменной, которую я ссылаюсь в следующем действии, и передаю его следующей функции.

public static Bitmap scaleDown(Bitmap realImage,boolean filter) {

    float maxImageSize = HeightToSet;
    float ratio = Math.min(
            (float) maxImageSize / realImage.getWidth(),
            (float) maxImageSize / realImage.getHeight());
    int width = Math.round((float) ratio * realImage.getWidth());
    int height = Math.round((float) ratio * realImage.getHeight());

    // Error here
    Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width,height, filter);
    return newBitmap;
}

Я уже пробовал звонить bitmap.recycle(). Почему я получаю эту проблему, что могу сделать, чтобы ее решить? Здесь мой logcat.

07-14 03:09:43.713: E/AndroidRuntime(19653): FATAL EXCEPTION: main
07-14 03:09:43.713: E/AndroidRuntime(19653): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected]
07-14 03:09:43.713: E/AndroidRuntime(19653):    at android.graphics.Canvas.throwIfRecycled(Canvas.java:955)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at android.graphics.Canvas.drawBitmap(Canvas.java:1012)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at android.graphics.Bitmap.createBitmap(Bitmap.java:462)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at com.example.Libraries.Snapshot.scaleDown(Snapshot.java:42)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at com.example.androidtestproject.RecommendationInfo.SetRecommendationValues(RecommendationInfo.java:195)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at com.example.androidtestproject.RecommendationInfo.access$5(RecommendationInfo.java:183)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at com.example.androidtestproject.RecommendationInfo$1.onClick(RecommendationInfo.java:154)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at android.view.View.performClick(View.java:2552)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at android.view.View$PerformClick.run(View.java:9229)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at android.os.Handler.handleCallback(Handler.java:587)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at android.os.Looper.loop(Looper.java:138)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at android.app.ActivityThread.main(ActivityThread.java:3701)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at java.lang.reflect.Method.invokeNative(Native Method)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at java.lang.reflect.Method.invoke(Method.java:507)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
07-14 03:09:43.713: E/AndroidRuntime(19653):    at dalvik.system.NativeStart.main(Native Method)
07-14 03:09:45.515: E/TAG(20039): End of input at character 0 of 
4b9b3361

Ответ 1

Скопируйте растровое изображение, прежде чем передавать его статической переменной.

Snapshot.CroppedBitmap = imageView.getDrawingCache(true);

к

Snapshot.CroppedBitmap = Bitmap.createBitmap(imageView.getDrawingCache(true));

Очень вероятно, что imageView перерабатывает свой кэш чертежа, когда он больше не нужен в качестве хорошей практики. Скопировав его, вы сохраните ссылку на растровое изображение, которое обработал ImageView. Просто сделайте копию, чтобы вы могли управлять собой!

Ответ 2

Сначала нужно скопировать исходное изображение:

Bitmap bitmap = webview.getDrawingCache();
if (bitmap != null) {
        Snapshot.CroppedBitmap.setImageBitmap(bitmap.copy(bitmap.getConfig(), false));
}
  • Использование createBitmap не обязательно создаст копию исходного растрового изображения, что приведет к той же ошибке.