GlideApp: OutOfMemory, обработка исключений, растровое изображение, попытка наложения 2 или 3 изображений - PullRequest
0 голосов
/ 05 марта 2020

Я мог бы выяснить, почему существует ООМ, но мне трудно найти любую другую альтернативу. Я новичок в Android и специально работаю с потоками, поэтому, пожалуйста, держите меня в покое, если это глупый вопрос. Мой код:

FutureTarget<Bitmap> futureTargetOverlay =
                         Glide.with(ctx)
                                    .asBitmap()
                                    .load(R.drawable.template810)
                                    .apply(new RequestOptions()
                                            .override(sz.getHeight() ,sz.getWidth()) 
                                    )
                                    .submit(width, height);
                    overlay = futureTargetOverlay.get();

Я получаю 2 растровых изображения (наложение, источник), как это, и использую холст для наложения их обоих друг на друга.

public static Bitmap overlay(Bitmap bmp1, Bitmap bmp2) {
        Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
        Canvas canvas = new Canvas(bmOverlay);

        canvas.drawBitmap(bmp1, new Matrix(), null);
        canvas.drawBitmap(bmp2, 0, 0, null);

        return bmOverlay;
    }

Основной Проблема заключается в следующем: вышеописанное прекрасно работает, если есть 2 или 3 таких операции (в зависимости от размера исходного изображения). Но проблема в том, что я вызываю этот метод в al oop для всех обрабатываемых элементов, и количество элементов может быть 1 или может быть 20 или более. И ... Вот как это выглядит (сокращенно)

public Item getSourcewithOverlay(Item i)
{
Async.execute(new Runnable(){
    String source = i.image.url;
    FutureTarget ft = ....; //get source
    Bitmap source = ft.get();
    FutureTarget ft1 = ....; //get overlay image
    Bitmap overlay = ft1.get();
    source = overlay(source, overlay);
    item.image.url = SaveToDevice(source);
  });
}

Естественно, задача Asyn c создаст огромное количество потоков, и я получаю OOM. Asyn c только потому, что я считаю, что ft.get () должен работать в фоновом потоке.

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

Большое спасибо за чтение этого длинного вопроса и спасибо за попытку помочь.

...