Java Android异步任务回收位图

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.

我想将位图数组存储到文本文件。因此,我将每个位图转换为Base64字符串,并将其合并为单个字符串并存储在TextFile中

这项工作:

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)