Java Android异步任务回收位图
我想将位图数组存储到文本文件。因此,我将每个位图转换为Base64字符串,并将其合并为单个字符串并存储在TextFile中 这项工作:Java Android异步任务回收位图,java,android,multithreading,bitmap,android-asynctask,Java,Android,Multithreading,Bitmap,Android Asynctask,我想将位图数组存储到文本文件。因此,我将每个位图转换为Base64字符串,并将其合并为单个字符串并存储在TextFile中 这项工作: String imjCodSrg = getImjCodSrgFrmBitmapAryFnc(bitmapAryVar); 但这需要很长的时间,所以我试图将异步任务或线程放入其中,但得到了回收的错误 new AsyncTask<Void, Void, Void>() { protected Void doInBackground(Void.
String imjCodSrg = getImjCodSrgFrmBitmapAryFnc(bitmapAryVar);
但这需要很长的时间,所以我试图将异步任务或线程放入其中,但得到了回收的错误
new AsyncTask<Void, Void, Void>()
{
protected Void doInBackground(Void... ArgAryPsgVar)
{
String imjCodSrg = getImjCodSrgFrmBitmapAryFnc(bitmapAryVar);
return null;
}
}.execute();
|*|我的助手功能:
// |==| 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);
}
首先,你不应该像这样存储位图。这样做会导致非常大的内存消耗。存储图像的正确方法是将图像保存到存储器中,并将文件路径写入数据库。是缓存位图的有用链接我现在正试图将其存储在文本文件中。。。但是如何克服重复使用的错误。不,我想你没有完全理解我。不要像这样存储位图。不在文本文件中,也不在非“image/*”(mime类型)的任何其他文件中。只需将您的
位图
保存为file.jpg即可。我不希望图像显示在gallery中。因此,如果你将图片放在内部应用程序存储中,我会用不同的格式写,它们不会显示在图库中。此外,您还可以在内部应用程序文件夹中创建.nomedia
文件(或者默认情况下它就在那里)。将文件存储在内部应用程序存储中与将其存储在其他位置相同,只需将图像保存到从GetFileDir()获取的路径中即可。此函数将返回内部应用程序存储的文件
。下面是一些关于.nomedia
// |==| 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);
}
> 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)