我的所有图像都在Android文件系统中加密。当我需要显示它们时,我需要解密,生成位图,然后删除该文件。我正在尝试使用毕加索加载我的图像。我创建了一个RequestHandler来解密和加载图像。Picasso RequestHandler - 加载图像前解密文件
RequestHandler接受两种类型的结果:
1.位图或2.流。
我试图返回流。这样毕加索可以使用最佳实践加载图像,防止内存不足。我创建了一个自定义Stream类并覆盖了Dispose()方法以在使用后删除解密文件。
问题是:流没有配置,既不关闭,图像加载后,我不能自动处置GAC(我使用Xamarin/C#)。 有什么想法?我能做什么?
UPDATE(19/01/17):我发现了我的代码中的一个小错误,修复后我的问题解决了。但这里是我的自定义RequestHandler供将来参考... EncryptedFileStream是我的自定义流,包装原始流并删除解密文件Dispose()。
public class EncryptedFilenameRequestHandler : RequestHandler
{
private readonly Context _context;
private readonly ICriptoService _criptoService;
public EncryptedFilenameRequestHandler(Context context, ICriptoService criptoService)
{
if (context == null) throw new ArgumentNullException(nameof(context));
if (criptoService == null) throw new ArgumentNullException(nameof(criptoService));
_context = context;
_criptoService = criptoService;
}
public override bool CanHandleRequest(Request request)
{
var uri = request.Uri;
return string.Compare(uri.Scheme, Constantes.AppSchema, true) == 0 &&
string.Compare(uri.Authority, Constantes.Host, true) == 0 &&
string.Compare(uri.Path, "/loadimagem/filename/encrypted", true) == 0;
}
public override Result Load(Request request, int networkPolicy)
{
string password = request.Uri.GetQueryParameter("p");
string encryptedFilename = request.Uri.GetQueryParameter("f");
string decryptedFilename = System.IO.Path.Combine(AppEnviroment.GetTempDirectory(), Guid.NewGuid().ToString("N"));
if (string.IsNullOrWhiteSpace(encryptedFilename) || !File.Exists(encryptedFilename))
return null;
_criptoService.Decrypt(encryptedFilename, decryptedFilename, password);
//retorna um stream para leitura do arquivo descriptografado
var uri = Android.Net.Uri.FromFile(new Java.IO.File(decryptedFilename));
var stream = new EncryptedFileStream(decryptedFilename, _context.ContentResolver.OpenInputStream(uri));
return new Result(stream, Picasso.LoadedFrom.Disk);
}
}
您的自定义流类是什么样的?不知道你的代码是什么样子,很难诊断问题。 – JohnWowUs