从文件路径获取位图
Getting bitmap from file path
所以问题是我想从绝对路径获取位图,所以我将这些路径作为 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());
}
这是我的线程池class:
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 实现吗?提前致谢!
你没有递增imageCounter
,所以它实际上是一个无限循环。
增强的 for 循环不易出错:
for (String uri : imageUris) {
...
Bitmap bitmap = BitmapFactory.decodeFile(uri);
...
imageCounter 值在 while 循环中没有改变,所以这个条件 (imageCounter < imageUris.size()) 总是 true 并且while 循环 运行 无限次
while(imageCounter < imageUris.size()) {
DecodeBitmapsThreadPool.post(new Runnable() {
@Override
public void run() {
Bitmap bitmap = BitmapFactory.decodeFile(imageUris.get(imageCounter));
mImagesBase64Array.add(bitmapToBase64(bitmap));
}
});
}
问题是您没有递增 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 循环通常是这些类型任务的最佳方法。
所以问题是我想从绝对路径获取位图,所以我将这些路径作为 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());
}
这是我的线程池class:
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 实现吗?提前致谢!
你没有递增imageCounter
,所以它实际上是一个无限循环。
增强的 for 循环不易出错:
for (String uri : imageUris) {
...
Bitmap bitmap = BitmapFactory.decodeFile(uri);
...
imageCounter 值在 while 循环中没有改变,所以这个条件 (imageCounter < imageUris.size()) 总是 true 并且while 循环 运行 无限次
while(imageCounter < imageUris.size()) {
DecodeBitmapsThreadPool.post(new Runnable() {
@Override
public void run() {
Bitmap bitmap = BitmapFactory.decodeFile(imageUris.get(imageCounter));
mImagesBase64Array.add(bitmapToBase64(bitmap));
}
});
}
问题是您没有递增 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 循环通常是这些类型任务的最佳方法。