Я мог бы выяснить, почему существует ООМ, но мне трудно найти любую другую альтернативу. Я новичок в 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 () должен работать в фоновом потоке.
В этом проблема. Я делаю это на деятельности. Какие могут быть другие возможные решения и / или обходные пути для этого. Если кто-то хотя бы может подсказать мне какую-то идею, я смогу учиться, учиться и работать над ней.
Большое спасибо за чтение этого длинного вопроса и спасибо за попытку помочь.