1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

App hängt beim Nachladen einiger Bilder/Daten

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Son Goku, 20.10.2011.

  1. Son Goku, 20.10.2011 #1
    Son Goku

    Son Goku Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    5
    Registriert seit:
    07.12.2010
    Hallo

    Ich haben folgendes "kleines" Problem:

    Ich hab eine ScrollView in der sich ein TableLayout befindet.
    Standardmäßig befinden sich beim Start 15 TableRows in diesem TableLayout.

    Jede Zeile hat dabei ein Platzhalterbild.
    Dieses Platzhalterbild wird, sobald die entsprechende Zeile in den sichtbaren Bereich gelangt, durch das richtige Bild ersetzt, welches von einem Webserver geladen wird.

    Das Laden des Bildes stellt soweit kein Problem dar. Sobald ich aber das Bild anzeigen lassen will hängt sich für 1-2 Sekunde die App auf.

    Code:
    this.runOnUiThread(new Runnable() {
      public void run() {
        if(img != null && iv != null) {
          iv.setImageDrawable(img); // ImageView
        }
      }
    });
    
    Da ich den hänger nicht hab, wenn ich Zeile 4 auskommentiere, nehme ich an, dass es irgendwie damit zusammen hängt.

    Genau das gleiche hab ich übrigens, wenn ich 15 weitere Zeilen nachladen will. Bis zu dem Zeitpunkt an dem alles geladen ist, läuft alles flüssig. Wenn ich es in mein View einhängen will, hängts wieder einige Sekunden.

    Was kann ich machen, damit mein App an dieser Stelle flüssig läuft? Gibts hier irgendwelche Tricks?

    Viele Grüße
    Son Goku
     
  2. the_alien, 20.10.2011 #2
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Hm, ist das image eventuelle einfach viel zu groß, so dass es erst runterskaliert wird?
    Ich mache ähnliches mit deutlich mehr Bildern und das ist komplett flüssig.
     
  3. Son Goku, 20.10.2011 #3
    Son Goku

    Son Goku Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    5
    Registriert seit:
    07.12.2010
    Das Bild ist in einer Dimension nicht größer als 100px und nicht größer als ein 2-3kb.

    Die Breite und Höhe des ImageView hab ich auf fix 100px gesetzt. Nehm ich die Größe raus, wird das Bild viel kleiner als bisher angezeigt. Das Platzhalterbild, was genau so groß ist, behält seine Größe.

    Aber das Problem bleibt das Gleiche!

    Kann ich evtl. den Main-Thread höher priorisieren, damit die GUI schneller aktualisiert wird?

    EDIT: Ich hab gerade festgestellt, dass das Platzhalterbild, sogar größer als 100px dargestellt wird, wenn ich keine Größenangaben im ImageView hab, obwohl das genau 100x100px misst.
     
  4. the_alien, 20.10.2011 #4
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Wie lädst du denn das Bild aus dem Web?
     
  5. Son Goku, 20.10.2011 #5
    Son Goku

    Son Goku Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    5
    Registriert seit:
    07.12.2010
    So

    Code:
    private Drawable loadImage(String imageURL) {
      try {
        URL url = new URL(imageURL);
        InputStream is = url.openStream();
        Drawable image = Drawable.createFromStream(is, "image");
        is.close();
        
        return image;
      } catch (MalformedURLException e) {
      } catch (IOException e) {
      }
      
      return null;
    }
    
    Anschließend wird direkt das oben schon genannte Codestück ausgeführt.


    Das Problem mit dem hängen beim Nachladen der 15 Datensätze ist wahrscheinlich das Gleiche. Da hängts ja auch. Nur etwas länger.
     
  6. the_alien, 20.10.2011 #6
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Ist das in einem AsyncTask? Hast du deinen eigenen Downloadthread?
     
  7. Son Goku, 20.10.2011 #7
    Son Goku

    Son Goku Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    5
    Registriert seit:
    07.12.2010
    AsyncTask sagt mir jetzt nichts. Downloadthread triffts wohl eher.
    Das erreichen des sichtbaren Bereiches wird in einem onTouchListener des ScrollView geprüft und wenn noch nicht vorhanden, ein eigener Thread extra fü den Download geöffnet.

    Hier der gesammte Code:

    Code:
    public void onCreate(Bundle savedInstanceState) {
      [...]
      final ScrollView sv = (ScrollView) findViewById(R.id.scrollView);
      sv.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
          [...]
          // 'tr' ist die TableRow, in dem das ImageView sitzt.
          final ImageView iv = (ImageView) tr.findViewById(R.id.imageView);
          final String imageURL = data[i].get("img").toString();
    
          new Thread(new Runnable() {
            public void run() {
              setImage(iv, imageURL);
            }
          }).start();
        }
      });
    }
    
    private Drawable loadImage(String imageURL) {
      try {
        URL url = new URL(imageURL);
        InputStream is = url.openStream();
        Drawable image = Drawable.createFromStream(is, "image");
        is.close();
        
        return image;
      } catch (MalformedURLException e) {
      } catch (IOException e) {
      }
      
      return null;
    }
    
    private void setImage(final ImageView iv, String imageURL) {
      final Drawable img = loadImage(imageURL);
      
      this.runOnUiThread(new Runnable() {
        public void run() {
          if(img != null && iv != null) {
            iv.setImageDrawable(img);
          }
        }
      });
    }
    
    Du arbeitest mit AsyncTasks?
    Meinst du das kann die Probleme beheben?
    Dann werd ich mich da morgen mal schlau machen.
     
  8. the_alien, 21.10.2011 #8
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Nein, ich benutzte den AsyncImageView aus der GreenDroid Lib. Diese lädt die Bilder in einem einzigen Thread herunter. Selbst mit 60 Remote Bildern funktioniert es einwandfrei und butterweich.
     
  9. Son Goku, 24.10.2011 #9
    Son Goku

    Son Goku Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    5
    Registriert seit:
    07.12.2010
    So, jetzt hat werr will die Gelegenheit zu lachen, wenn ich sage, was denn genau die Ldösung des Problems war, bzw. was mein Problm überhaupt verursacht hat.

    Es war der Debugger!
    Nachdem ich am Freitag nicht mehr dazu gekommen bin, an der App auch nur irgendwas zu machen, hab ich die am WE mal ein paar Freunden zum testen gegeben. Alles lief Problemlos. Selbst bei mir selbst, nachdem ich die App das erste Mal ohne Debugger am laufen hatte. Wieder am Debugger angeschlossen hab ich wieder die Hänger drin. Sonst läuft es ganz akzeptabel. Kleinere Hänger hab ich noch, aber die kann ich beim Market auch beobachten, also insoweit erstmal vernachlässigbar.

    Nochmal Danke für deine Hilfe!
     

Diese Seite empfehlen