Bild aus Internet laden, Absturz der App

  • 6 Antworten
  • Letztes Antwortdatum
W

WolfCH

Ambitioniertes Mitglied
1
Hallo

Ich wollte ein Bild aus dem Internet herunterladen und in einer ImageView anzeigen lassen. Für den Download habe ich die Klasse "ImageDownloader":

Code:
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
 
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

/**
 * @author SCVSwitzerland
 *
 */
 
public class ImageDownloader {
    public Bitmap downloadImage(String downloadUrl) {
        InputStream inputStream = null;
        try {
            URL url = new URL(downloadUrl);
            inputStream = url.openStream();
            return BitmapFactory.decodeStream(inputStream);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}

Keine Fehler soweit. Ich erhalte für das ImageView lediglich eine Warnung, weil es im Moment nur so dasteht:

Code:
<ImageView android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:id="@+id/blitz" />

Jetzt möchte ich das Bild laden und in der ImageView anzeigen. Dafür hab ich

Code:
//Bild aus Netz runterladen und in Imageview anzeigen
		ImageView blitzortung = (ImageView) findViewById(R.id.blitz);
        ImageDownloader imageDownloader = new ImageDownloader();
        Bitmap bitmap = imageDownloader.downloadImage("http://images.blitzortung.org/Images/image_b_de.png?t=22656463");
        blitzortung.setImageBitmap(bitmap);

verwendet. Die SDK buildet mir ohne Fehler die APK. Rechte wie Internet usw. sind auch vorhanden. Jedoch stürzt mir die App ab, sobald ich auf die uwmeldeactivity gehen will, wo das Bild geladen werden soll.

Es kommt stets "Die App ... wurde unerwartet beendet". Entferne ich den Code wieder um das Bild herunterzuladen, dann gehts wieder ohne Probleme.

An was liegt das? Komme nicht auf den Nenner oder bin einfach noch zu Neu in der Materie Android Entwicklung..

Gruss
Dominic
 
Muss ich für einen Thread nun einfach die AsyncTask um die ganze class ImageDownloader machen oder wie?

Habe bisher kein Tutorial gefunden um Schritt für Schritt in AsyncTask oder Threads "eingeführt" zu werden.
 
Du schreibst in doInBackground die zeilen in denen das bild runtergeladen wird.
In postexecute zeigst du das bild dann an.

Gesendet von meinem GT-S5660 mit der Android-Hilfe.de App
 
Ich nutze jetzt folgendes:

Code:
//weitere ablauf der activity
	new Thread(new Runnable() {
	        public void run() {
	        	//Bild aus Netz runterladen und in Imageview anzeigen
				final ImageView myImageView = (ImageView) findViewById(R.id.blitz);
		        ImageDownloader imageDownloader = new ImageDownloader();
		        final Bitmap bitmap = imageDownloader.downloadImage("http://images.blitzortung.org/Images/image_b_de.png?t=22656463");
	            myImageView.post(new Runnable() {
	                public void run() {
	                    myImageView.setImageBitmap(bitmap);
	                }
	            });
	        }
	    }).start();


Habe mich mal mit dem Thema AsyncTask befasst aber ich komme nicht zurecht damit. Alle public voids doInBackground usw.. schlugen fehl... wenn zb steht doInBackround(String... params) dann bekomm ich Fehlermeldung, exectp "...", string must given by a String, params error...

Habe mir zahlreiche Beispiele angesehen doch irgendwie will nichts richtig. Ich wollte, da das Bild bei langsamer Verbindung länger lädt, eine Progressbar angezeigt wird und Text "Bitte warten, lade...".

Gruss
 
Also hier mal ausführlich, Code von Android Developers.

Diesen Code setzt du vor die letzte schließende Klammer deiner Activity(also noch innerhalb der Klasse:

Code:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected void onPretExecute() {
         showDialog("Bitte Warten...");
     }
     protected void doInBackground(URL... urls) {
        
downloadImage();
            
             publishProgress(int);//hier kannst du einen int geben, der für eine       //Progressbar genutzt werden kann
           
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);//hier wird dann die statusbar gesetzt //aus dem wert den du mit publish gegeben hast
     }

     protected void onPostExecute(Long result) {
        dialog.dismiss();
     }

 public Bitmap downloadImage(String downloadUrl) {//Wenn public nicht geht, probier mal private...
        InputStream inputStream = null;
        try {
            URL url = new URL(downloadUrl);
            inputStream = url.openStream();
            return BitmapFactory.decodeStream(inputStream);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

 }

So sollte es funktionieren.
 
  • Danke
Reaktionen: WolfCH
Danke für diese Antwort. Ja ich hab es ja genau mit diesem Code auch schon versucht und lasse mir nun jeder einzelner Teil durch den Kopf gehen.. ;)

Denn ich bekomme Fehler wie publishProgress does not resolved a function etc.. Woher krieg ich das denn?

Ich versuch noch selbst einmal und ansonsten meld ich mich wieder.

PS: Gibt irgendwo in der AndroidRefrenz eine Liste für was man welche Imports machen muss??

Gruss
 
Zurück
Oben Unten