【问题标题】:Java InputSream hascode is different each time even when the request is same即使请求相同,Java InputStream hashcode 每次也不同
【发布时间】:2017-01-31 22:20:31
【问题描述】:

我有一个不特定于UniversalImageLoader 的查询,但因为我正在尝试使用内容流来加载图像,所以我面临以下问题。

我正在使用输入流“stream://”来使用 ImageLoader。一切正常,除了相同请求的输入流的哈希码生成不同,因此迫使图像加载器再次从网络而不是磁盘下载图像。

我应该怎么做才能解决它。

PS:我尝试关注here的回答

获取 InputStream 的代码是(UtilityMethod 只是一个异步任务):

 public void displayContentImage(final String fileId, final ImageView imageView) {
    UtilityMethods.startMyTask(new AsyncTask<Object, Void, InputStream>() {

        @Override
        protected InputStream doInBackground(Object... params) {
            CMServiceGateway cmServiceGateway = new CMServiceGateway();
            final InputStream inputStream = cmServiceGateway.GetContentAsStream(fileId);
            if (inputStream != null) {
                //String imageId = "stream://" + inputStream.hashCode();
                //Log.d("ImageId :: 1 ::", "file id : " + fileId + "hashcode:  " + imageId);
                //String imageId2 = "stream://" + cmServiceGateway.GetContentAsStream(fileId).hashCode();
                //Log.d("ImageId :: 2 ::", "file id : " + fileId + "hashcode:  " + imageId2);
                return inputStream;
            }
            return null;
        }

        @Override
        protected void onPostExecute(InputStream inputStream) {
            if (inputStream != null) {
                displayImage(inputStream, imageView);
            }
        }
    });
}

【问题讨论】:

  • 您能说明如何获取图像流吗?从哪里来?
  • 据我所知,您正在打开流并比较它们的 hashValue。 IDK 流哈希的合约,但对于普通对象,它只是它们的地址。新流 = 新对象 = 新地址。如果我的理论是正确的,你不能用 hashCode 来比较它们。你得自己写比较方法或者先发一个图片的md5,这样就可以把网络图片的md5和本地拷贝的md5进行比较。
  • @HopefullyHelpful 感谢您的帮助,这可能适用于两个不同的对象。但是如果您注意到两个 Log.d 中的 inputStream 对象是相同的。这就像一个接一个地调用同一对象的两个hascode,你会得到两个不同的答案。我不确定这是否是哈希码的工作方式。

标签: android inputstream universal-image-loader


【解决方案1】:

哈希码相等的基本问题就像上面的示例一样,即使使用的 inputStream 对象相同,您也会发现第二个日志哈希码与第一个日志哈希码不同。

 //String imageId = "stream://" + inputStream.hashCode();
            //Log.d("ImageId :: 1 ::", "file id : " + fileId + "hashcode:  " + imageId);
            //String imageId2 = "stream://" + cmServiceGateway.GetContentAsStream(fileId).hashCode();
            //Log.d("ImageId :: 2 ::", "file id : " + fileId + "hashcode:  " + imageId2);

虽然没有准确回答上述问题,但我可以通过不将哈希码作为 id 传递给通用图像加载器来解决这个问题。相反,我传递了唯一的文件 ID,现在它可以很好地显示内存缓存中的图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2017-04-02
    • 2016-10-12
    相关资源
    最近更新 更多