Получение растрового изображения из пути к файлу

Итак, дело в том, что я хочу получить Bitmap из абсолютного пути, поэтому я передаю эти пути как ArrayList<Strings> моему ведущему, где у меня есть следующий фрагмент кода:

private void decodeImageUri(final ArrayList<String> imageUris) {

    while(imageCounter < imageUris.size()) {
        DecodeBitmapsThreadPool.post(new Runnable() {
            @Override
            public void run() {

                Bitmap bitmap = BitmapFactory.decodeFile(imageUris.get(imageCounter));

                mImagesBase64Array.add(bitmapToBase64(bitmap));
            }
        });
    }
    DecodeBitmapsThreadPool.finish();
    Log.d("SIZE OF BASE64", " ---------- " + mImagesBase64Array.size());

}

И это мой класс ThreadPool:

public class DecodeBitmapsThreadPool {

private static DecodeBitmapsThreadPool mInstance;
private ThreadPoolExecutor mThreadPoolExec;
private static int MAX_POOL_SIZE;
private static final int KEEP_ALIVE = 10;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();

public static synchronized void post(Runnable runnable) {
    if (mInstance == null) {
        mInstance = new DecodeBitmapsThreadPool();
    }
    mInstance.mThreadPoolExec.execute(runnable);
}

private DecodeBitmapsThreadPool() {
    int coreNum = Runtime.getRuntime().availableProcessors();
    MAX_POOL_SIZE = coreNum * 2;
    mThreadPoolExec = new ThreadPoolExecutor(
            coreNum,
            MAX_POOL_SIZE,
            KEEP_ALIVE,
            TimeUnit.SECONDS,
            workQueue);
}

public static void finish() {
    mInstance.mThreadPoolExec.shutdown();
}

}

Итак, когда я запускаю ThreadPool, похоже, что он попадает в какой-то бесконечный цикл (согласно Logcat), а затем я просто получаю OutOfMemoryException. Интересно, что я делаю неправильно, так как я не могу его отладить. Я просто хочу декодировать растровое изображение в фоновых потоках и создать представление этих растровых изображений base64, чтобы я мог загрузить их на сервер. P.S. Любые идеи, как это можно реализовать с помощью RxJava2? Заранее спасибо!


person RadoVidjen    schedule 15.06.2018    source источник


Ответы (3)


Вы не увеличиваете imageCounter, так что на самом деле это бесконечный цикл.

Расширенный цикл for менее подвержен ошибкам:

for (String uri : imageUris) {
    ...
    Bitmap bitmap = BitmapFactory.decodeFile(uri);
    ...
person bwt    schedule 15.06.2018
comment
О господи, какая ошибка... Большое спасибо :) - person RadoVidjen; 15.06.2018

Значение imageCounter не изменилось в цикле while, поэтому это условие (imageCounter ‹ imageUris.size()) всегда истинно, и цикл while выполняется бесконечное число раз.

 while(imageCounter < imageUris.size()) {
        DecodeBitmapsThreadPool.post(new Runnable() {
            @Override
            public void run() {

                Bitmap bitmap = BitmapFactory.decodeFile(imageUris.get(imageCounter));

                mImagesBase64Array.add(bitmapToBase64(bitmap));
            }
        });
    }
person Navadeep Tiwari    schedule 15.06.2018

Проблема в том, что вы не увеличиваете цикл while, поэтому условие цикла while никогда не будет выполнено. Вы должны увеличить его в конце кода в цикле while следующим образом:

while(imageCounter < imageUris.size()) {
    DecodeBitmapsThreadPool.post(new Runnable() {
        @Override
        public void run() {

            Bitmap bitmap = BitmapFactory.decodeFile(imageUris.get(imageCounter));

            mImagesBase64Array.add(bitmapToBase64(bitmap));
        }
    });

    imageCounter++;
}

Хотя, как упоминалось в ответе bwt, расширенный цикл for, как правило, является лучшим подходом для таких задач.

person Alex Oczkowski    schedule 11.10.2018