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?
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
ja, ich benutze den Start, aber das Bild wird null sein, bis ich verwendet run. – jade
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