La pieza simple de código midlet (clase Moo) a continuación (después de los extractos) interbloqueos (Al menos supongo que interbloqueos después de leer esta publicación en los hilos here).j2me red, subprocesos y bloqueos
He reproducido los extractos pertinentes de la publicación:
String url = ...
Connection conn = null;
try {
conn = Connector.open(url);
// do something here
}
catch(IOException e){
// error
}
La raíz del problema es la naturaleza de bloqueo de la llamada open(). En algunas plataformas, el sistema realiza la conexión real bajo las cubiertas, en el equivalente de un hilo separado. El hilo de llamada bloquea hasta que el hilo de conexión realiza la conexión. Al mismo tiempo, el subsistema de seguridad puede requerir que el usuario confirme la conexión, y el hilo de conexión se bloquea hasta que el hilo del evento reciba la confirmación del usuario. El bloqueo se produce porque el hilo del evento ya está esperando el hilo de conexión.
public class Moo extends MIDlet {
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
}
protected void startApp() throws MIDletStateChangeException {
Display display = Display.getDisplay(this);
MyCanvas myCanvas = new MyCanvas();
display.setCurrent(myCanvas);
myCanvas.repaint();
}
class MyCanvas extends Canvas {
protected void paint(Graphics graphics) {
try {
Image bgImage = Image.createImage(getWidth(), getHeight());
HttpConnection httpConnection = (HttpConnection) Connector
.open("http://stackoverflow.com/content/img/so/logo.png");
Image image = Image.createImage(httpConnection
.openInputStream());
bgImage.getGraphics().drawImage(image, 0, 0, 0);
httpConnection.close();
graphics.drawImage(bgImage, 0, 0, 0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Puede alguien por favor dígame cómo la invocación de hilos del sistema se hace aquí (hilos de eventos y notificación) y la secuencia de eventos que conducen al estancamiento. No estoy seguro de cuáles son los hilos involucrados aquí que conducen a un punto muerto.
- ¿Hay alguna documentación sobre el modelo de rosca j2me?
- ¿Dónde puedo obtener las fuentes para las clases del sistema j2me (quiero verificar la implementación de las clases de conexión)?
EDIT: En el código anterior obtengo la lógica. Pero el siguiente código al menos debería funcionar ¿verdad? Este también bloquea las conexiones donde estoy haciendo la conexión de red en un hilo separado.
public class Foo extends MIDlet {
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
Display display = Display.getDisplay(this);
MyCanvas myCanvas = new MyCanvas();
display.setCurrent(myCanvas);
myCanvas.repaint();
}
class MyCanvas extends Canvas {
protected void paint(Graphics graphics) {
try {
Image bgImage = Image.createImage(getWidth(), getHeight());
FetchImage fetchImage = new FetchImage();
Thread thread = new Thread(fetchImage);
thread.start();
thread.join();
bgImage.getGraphics().drawImage(fetchImage.image, 0, 0, 0);
graphics.drawImage(bgImage, 0, 0, 0);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class FetchImage implements Runnable {
public Image image;
public void run() {
HttpConnection httpConnection;
try {
httpConnection = (HttpConnection) Connector
.open("http://10.4.71.200/stage/images/front/car.png");
image = Image.createImage(httpConnection.openInputStream());
httpConnection.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Excelente pregunta y respuesta, especialmente si realmente quieres algo de claridad con esta cosa de enhebrar. – Sydwell