2016-09-23 1 views
1

Ich habe eine Abfrage nicht speziell auf UniversalImageLoader, aber weil ich versuche, den Content-Stream zu verwenden, um das Bild zu laden, ich bin nach folgenden Problem konfrontiert.Java InputStream hascode ist jedes Mal anders, auch wenn die Anfrage gleich ist

Ich verwende den Eingabestream "stream: //", um ImageLoader verwenden zu können. Alles funktioniert gut, außer dass der Hashcode des Eingabestroms für die gleiche Anfrage anders erzeugt wird und zwingt den Imageloader daher, das Bild erneut von dem Netzwerk anstatt von der Platte herunterzuladen.

Was soll ich tun, um es zu beheben.

PS: Ich habe versucht, die Antwort von here

Der Code zu bekommen Input ist (Die UtilityMethod ist erwähnen gerade eine Asynchron-Task) zu folgen:

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

Können Sie zeigen, wie Sie Ihren Image-Stream bekommen? Woher? – NOSTRA

+0

Sie öffnen Streams und vergleichen ihren HashValue soweit ich sehen kann. IDK der Vertrag für Stream-Hashes, aber für normale Objekte ist es nur ihre Adresse. Neuer Stream = neues Objekt = neue Adresse. Sie können sie nicht mit hashCode vergleichen, wenn meine Theorie stimmt. Sie müssen Ihre eigene Vergleichsmethode schreiben oder eine md5 des Bildes im Voraus senden, so dass Sie die md5 des Netzwerkbildes mit der lokalen Kopie md5 vergleichen können. – HopefullyHelpful

+0

@HopefullyHilfreiche Dank für Sie Kommentare das könnte für zwei verschiedene Objekte wahr sein. Wenn Sie jedoch feststellen, dass das inputStream-Objekt in Log.d identisch ist. Es ist so, als würde man zwei Hasencodes des gleichen Objekts nacheinander aufrufen und man erhält zwei verschiedene Antworten. Ich bin mir nicht wirklich sicher, ob Hashcode so funktioniert. – Sudhir

Antwort

1

Das grundlegende Problem des Hash-Code gleich wie Im obigen Beispiel finden Sie, dass sich der zweite Protokoll-Hash-Code vom ersten Protokoll-Hash-Code unterscheidet, auch wenn das verwendete inputStream-Objekt identisch ist.

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

Obwohl es nicht die oben genannte Frage genau zu beantworten, aber ich bin in der Lage, dieses Problem zu lösen, indem sie nicht den Hash-Code zu dem universellen Bild loader als id übergeben. Stattdessen übergab ich die eindeutigen Datei-IDs und es funktionierte jetzt gut, um Bild aus Speichercache anzuzeigen.

Verwandte Themen