2012-04-02 7 views
2

Ich habe eine Liste von Bildern aus dem Internet heruntergeladen werden und in einer Liste zusammen mit Beschreibungstext neben jedem Bild gefüllt.Herunterladen von Bildern im Hintergrund mit j2me und lwuit

Das Problem, das ich jetzt habe, ist, dass der App freeze wird, wenn die Bilder heruntergeladen werden, dass ich understand.`

habe ich einen Faden um das Herunterladen zu tun, ist die Klasse unten. Ich benutze die start Methode, um Thread zu starten, aber das Bild wird null sein, bis ich run verwendet.

public class GetImage extends Thread { 

public String imgString; 
private String url; 
private Label label; 
public Image img = null; 

public GetImage(String url, Label label){ 
    this.url = url; 
    this.label = new Label(); 
    this.label = label; 
} 

public Image getPic() 
{ 

    return img; 
} 
public void run() 
{ 
    this.getImage_(); 
    this.label.setIcon(img.scaledHeight(60)); 

} 

public void getImage_() 
{ 
    HttpConnection hc = null; 
    DataInputStream dis = null; 
    DataOutputStream dos = null; 
    StringBuffer messageBuffer = new StringBuffer(); 

    try{ 
     hc = (HttpConnection)Connector.open(this.url,Connector.READ); 
     dis = new DataInputStream(hc.openDataInputStream()); 
     int ch; 
     long len = hc.getLength(); 
     if(len != -1) 
     { 
      for(int i=0; i < len; i++) 
       if((ch = dis.read())!=-1) 
        messageBuffer.append((char)ch); 
     } 
     else 
     { 
      while((ch = dis.read()) != -1) 
       messageBuffer.append((char)ch); 
     } 

     this.img = Image.createImage(messageBuffer.toString().getBytes(),0,messageBuffer.toString().length()); 
     dis.close(); 
    } 
    catch(IOException ae){ 
     messageBuffer.append("Error"); 
    } 
    finally{ 
     try { 
      if (hc != null) hc.close(); 
     } 
     catch (IOException ignored) {} 
     try { 
      if (dis != null) dis.close(); 
     } 
     catch (IOException ignored) {} 
     try { 
      if (dos != null) dos.close(); 
     } 
     catch (IOException ignored) {} 
    } 

    //return this.img; 
} 

} 

und die listrenderer die Liste anzuzeigen:

public class ListRenderer extends Label implements ListCellRenderer { 

public ListRenderer() 
{ 
    super(); 
} 

public Component getListCellRendererComponent(List list, Object o, int i, boolean bln) { 
    //cast the value object into a Content 

    Contents entry = (Contents)o; 
    //get the icon of the Content and set it for this label 
    this.setIcon(entry.getIcon()); 
    //get the text of the Content and set it for this label 
    this.setText(entry.getText()); 
    //set transparency 
    getStyle().setBgTransparency((byte)128); 
    //set background and foreground colors 
    //depending on whether the item is selected or not 
    if(bln) 
    { 
     getStyle().setBgColor(0xffcc33); 
     getStyle().setFgColor(0x000000); 
    } 
    else 
    { 
     getStyle().setBgColor(0xffffff); 

    } 
    return this; 
} 

public Component getListFocusComponent(List list) { 
    setText(""); 
    setIcon(null); 
    getStyle().setBgColor(0xffcc33); 
    getStyle().setBgTransparency(80); 
    return this; 
} 

} 

kann jemand helfen?

+0

Das einzige, was mir einfällt, ist, dass Sie Ihren Thread erstellen und "run" anstatt "start" aufrufen. Die "Start" -Methode wird die asynchrone Magie passieren lassen. – Dylan

+0

ja, ich benutze den Start, aber das Bild wird null sein, bis ich verwendet run. – jade

+0

Die Fehler, die Sie bekommen, sind, weil Sie nicht richtig synchronisieren. Überprüfen Sie das [Tutorial vorgeschlagen in Antwort auf Ihre vorherige Frage] (http://stackoverflow.com/a/9959124/839601) - all diese kryptischen 'synchronisiert', 'warten',' notify' sind aus einem bestimmten Grund da – gnat

Antwort

0

Die Kommentare, die Sie erhalten haben, sind wahrscheinlich richtig. Diese blog post zeigt etwas, das dem ähnelt, was Sie versuchen zu erreichen. Es ist in Codename One, aber der Großteil des Codes sollte auch für LWUIT gelten.

+0

Danke Jungs, Ihre Kommentare waren sehr nützlich. Ich habe schließlich die callSerialAndWait() -Methode verwendet, die vom Lwuit EDT bereitgestellt wurde, und es hat wirklich funktioniert. – jade

Verwandte Themen