2016-03-31 4 views
0

Ich analysiere ein JSON Obj, um die URL eines Bildes zu erhalten. Ich verwende diesen Code.Wie kann ich ein Bild von einer URL abrufen? Fehler

private Drawable LoadImageFromWebOperations(String strPhotoUrl) { 
    try { 
     InputStream is = (InputStream) new URL(strPhotoUrl).getContent(); 
     Drawable d = Drawable.createFromStream(is, "src name"); 
     Log.e("TAGG", strPhotoUrl); 
     return d; 
    } catch (Exception e) { 
     Log.e("TAGG", e.toString()); 
     return null; 
    } 
} 

Aber ich erhalte eine Fehlermeldung, dass dies in einem AsyncTask getan werden muss, das heißt., Verschiedene Themen. Aber wie kann ich das Zeichen in ein ImageView einfügen? Seit DoInBackground() haben keinen Zugriff auf UI-Elemente. Ich habe auch keinen Zugriff auf die URL, bis ich das JSON-Objekt analysiere, von dem ich die URL bekomme. Welche Lösung kann ich in meiner Situation anwenden? Vielen Dank!

+0

Verwenden Sie eine der [Bibliotheken zum Laden von Bildern für Android] (http://android-arsenal.com/tag/46), z. B. [Picasso] (http://square.github.io/picasso/) . Sie behandeln den Hintergrund Threading und so für Sie. – CommonsWare

+0

@CommonsWare gibt es keine andere Option als die Verwendung externer Bibliotheken. Ich bin neu in der Verwendung von Bibliotheken. Könnten Sie mir bitte helfen, das zu verstehen? Vielen Dank. –

+0

Es gibt viele Tutorials zur Verwendung von Picasso in Android. In der Tat, zuletzt habe ich überprüft, ihre git Repo hatte ein paar Beispiele in der README – zgc7009

Antwort

1

Sie können auf die UI-Elemente von onPostExecute() zugreifen.

So können Sie die API aufrufen und die Daten im Hintergrund Thread abrufen. Nachdem das Bild heruntergeladen wurde, können Sie das Bild in der onPostExecute() -Methode auf ImageView setzen.

+0

Aber ich kann 'InputStream nicht verwenden = (InputStream) neue URL (strPhotoUrl) .getContent();' Dies in 'onPostExecute' –

+0

Nein, Sie laden das Bild im Hintergrund Thread und verwenden Sie dieses Bild in Post ausführen. – Swayam

+0

Wie ich in der Frage erwähnt habe, kann ich das nicht in 'doInBackground()' tun, weil ich die URL dann nicht habe. Ich muss die URL in 'onPostExecute()' analysieren. Deshalb. Muss ich also eine andere 'AsyncTask' verwenden? –