当前位置:  开发笔记 > 编程语言 > 正文

代理InputStream的方法

如何解决《代理InputStream的方法》经验,为你挑选了0个好方法。

我正在使用Android-Universal-Image-LoaderHTTPS在我的Android应用程序上从远程服务器加载图像.要访问映像,客户端应提供有效的令牌,有时服务器可能会返回"过期的crsf令牌"错误.为了处理此行为,应定义自定义ImageDownloader.下面是我的实现中应该覆盖的方法的基本实现.

protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {
    HttpURLConnection conn = createConnection(imageUri, extra);

    int redirectCount = 0;
    while (conn.getResponseCode() / 100 == 3 && redirectCount < MAX_REDIRECT_COUNT) {
         conn = createConnection(conn.getHeaderField("Location"), extra);
         redirectCount++;
    }

    InputStream imageStream;
    try {
         imageStream = conn.getInputStream();
    } catch (IOException e) {
         // Read all data to allow reuse connection (http://bit.ly/1ad35PY)
         IoUtils.readAndCloseStream(conn.getErrorStream());
         throw e;
    }
    if (!shouldBeProcessed(conn)) {
         IoUtils.closeSilently(imageStream);
         throw new IOException("Image request failed with response code " + conn.getResponseCode());
    }

    return new ContentLengthInputStream(new BufferedInputStream(imageStream, BUFFER_SIZE), conn.getContentLength());
}

我想重写它来处理无效的令牌错误.例如,如果服务器返回此错误,则应该识别它,应该重新生成令牌并重复请求.

我提出的唯一解决方案就是这样(缩短代码):

imageStream = conn.getInputStream();
byte[] body = org.apache.commons.io.IOUtils.toByteArray(imageStream);
if (body.length < 300  // high probability to contain err message
             && isInvalidToken(body)) {
              // handle error
}
return new ByteArrayInputStream(body);

使用这种解决方案是否安全,考虑到我只使用最大80kb尺寸的缩略图?还有其他解决方案吗?

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有