2016-09-23 29 views
1

У меня есть запрос, не относящийся к UniversalImageLoader, но потому что я пытаюсь использовать поток контента для загрузки изображения, с которым сталкивается следующая проблема.Java InputSream hascode отличается каждый раз, даже когда запрос одинаковый.

Я использую поток ввода «stream: //», чтобы использовать ImageLoader. Все работает отлично, за исключением того, что хэш-код входного потока для одного и того же запроса генерируется по-разному и, следовательно, заставляет 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); 
      } 
     } 
    }); 
} 
+0

Можете ли вы показать, как вы получаете поток изображений? Откуда? – NOSTRA

+0

Вы открываете потоки и сравниваете их hashValue, насколько я вижу. IDK - контракт на потоковые хэши, но для обычных объектов это просто их адрес. Новый поток = новый объект = новый адрес. Вы не можете сравнить их с hashCode, если моя теория верна. Вы должны написать свой собственный метод сравнения или отправить md5 изображения вперед, чтобы вы могли сравнить md5 сетевого изображения с локальной копией md5. – HopefullyHelpful

+0

@HopefullyHelpful спасибо за ваши комментарии, это может быть правдой для двух разных объектов. Но если вы заметили, что объект inputStream в Log.d одинаковый. Это похоже на вызов двух идентификаторов одного и того же объекта один за другим, и вы получаете два разных ответа. Я не уверен, работает ли хэш-код. – Sudhir

ответ

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); 

Хотя не отвечая на поставленный выше вопрос точно, но я могу решить эту проблему, не передавая хэш-код для универсального загрузчика изображения в качестве идентификатора. Вместо этого я передал уникальный идентификатор файла, и теперь он отлично работал, чтобы отображать изображение из кеша памяти.