gpt4 book ai didi

java - Android 异步任务回收位图

转载 作者:行者123 更新时间:2023-11-30 00:29:00 25 4
gpt4 key购买 nike

我想将位图数组存储到 TextFile。所以我将每个位图转换为 Base64 字符串并将其连接成一个字符串并存储在 TextFile 中。

这个有效:

String imjCodSrg = getImjCodSrgFrmBitmapAryFnc(bitmapAryVar);

但这需要很长时间,所以我尝试放入异步任务或线程,但出现回收错误。

new AsyncTask<Void, Void, Void>()
{
protected Void doInBackground(Void... ArgAryPsgVar)
{
String imjCodSrg = getImjCodSrgFrmBitmapAryFnc(bitmapAryVar);

return null;
}
}.execute();

|或者|

new Thread(new Runnable()
{
@Override
public void run()
{
String imjCodSrg = getImjCodSrgFrmBitmapAryFnc(bitmapAryVar);
}
}).start();

|*|我的辅助功能:

// |==| Get Imj Byte Ary From Bitmap :

byte[] getImjBytAryFrmBitmapFnc(Bitmap srcImjBitmap)
{
ByteArrayOutputStream imjBytAryVar = new ByteArrayOutputStream();
srcImjBitmap.compress(Bitmap.CompressFormat.JPEG, 100, imjBytAryVar);
return imjBytAryVar.toByteArray();
}

// |==| Get Image String Code From Bitmap Array :

String getImjCodSrgFrmBitmapAryFnc(List<Bitmap> srcImjBitmapVar)
{
List<String> imjSrgCodAryVar = new ArrayList<>();
for (Bitmap bitmapIdxVar : srcImjBitmapVar)
{
PrnFnc("bitmapIdxVar.isRecycled() : " + bitmapIdxVar.isRecycled());
byte[] ImjBytAryIdxVar = getImjBytAryFrmBitmapFnc(bitmapIdxVar);
String ImjCodSrgIdxVar = Base64.encodeToString(ImjBytAryIdxVar, Base64.DEFAULT);
imjSrgCodAryVar.add(ImjCodSrgIdxVar);
}
return TextUtils.join("|", imjSrgCodAryVar);
}

我无法理解为什么 AsyncTask 或线程正在回收 Bitmap。

I get the following error :

D/TAG: bitmapIdxVar.isRecycled() : false
D/TAG: bitmapIdxVar.isRecycled() : true

>   E/UncaughtException: java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalStateException: Can't compress a recycled bitmap
at android.graphics.Bitmap.checkRecycled(Bitmap.java:351)
at android.graphics.Bitmap.compress(Bitmap.java:1018)

最佳答案

首先 - 你永远不应该像这样存储位图。这样做会导致非常大的内存消耗。存储图像的正确方法 - 将它们保存到存储中并将文件路径写入数据库。 Here是缓存 Bitmaps 的有用链接。

关于java - Android 异步任务回收位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44820412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com