1

所以问题是我想从绝对路径获取位图,所以我将这些路径传递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 表示,因此我可以将它们上传到服务器。PS任何想法如何用RxJava2实现?提前致谢!

4

3 回答 3

7

你不是在递增imageCounter,所以它实际上是一个无限循环。

增强的 for 循环不易出错:

for (String uri : imageUris) {
    ...
    Bitmap bitmap = BitmapFactory.decodeFile(uri);
    ...
于 2018-06-15T08:45:44.397 回答
2

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));
            }
        });
    }
于 2018-06-15T08:49:26.553 回答
0

问题是您不增加 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 循环通常是这些类型任务的最佳方法。

于 2018-10-11T05:54:15.963 回答