Picasso RequestHandler - 在加载图片

时间:2017-01-16 13:00:28

标签: android picasso

我的所有图片都是在Android文件系统中加密的。当我需要显示它们时,我需要解密,生成位图然后删除文件。我正在尝试使用Picasso来加载我的图像。我创建了一个 RequestHandler 来解密和加载图像。

RequestHandler 接受两种类型的结果:

1。位图或 2。一个流。

我正在尝试返回该流。这样Picasso可以使用最佳实践加载图像,防止内存不足。我创建了一个自定义的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);
  }

}

1 个答案:

答案 0 :(得分:0)

我在代码中发现了一个小错误,在修复之后,我的问题就解决了。此问题中发布的 EncryptedFilenameRequestHandler 代码正常运行。