App hängt beim Nachladen einiger Bilder/Daten

S

Son Goku

Ambitioniertes Mitglied
5
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
 
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.
 
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.
 
Wie lädst du denn das Bild aus dem Web?
 
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.
 
Ist das in einem AsyncTask? Hast du deinen eigenen Downloadthread?
 
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.
 
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.
 
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!
 

Ähnliche Themen

B
Antworten
4
Aufrufe
432
bb321
B
R
  • Robby1950
2
Antworten
23
Aufrufe
954
Robby1950
R
netfreak
  • netfreak
Antworten
10
Aufrufe
438
netfreak
netfreak
Zurück
Oben Unten