Como usasr HttpConnection corretamente?

4 respostas
W

Saudações!

Gostaria que me ajudassem com um exemplo de HttpConnection em J2ME. O WTK 2.0 vem com exemplos mas não consigo visualizar a aplicação. Peguei um exemplo de código, mas não consigo rodar. O “build” é normal e compila normal. Vou deixar o código(que peguei na net) p/ vc’s verem. Quando clico no select vou em “buscar”, aí aparece no WTK a msg:

“Warning: To avoid potential deadlock, operations that may block, such as networking, should be performed in a different thread than the commandAction() handler.”

O que significa isso?
O que preciso para usar HttpConnection?Só o WTK 2.0 não é suficiente?
O código é:

import javax.microedition.lcdui.<em>;

import javax.microedition.midlet.</em>;

import <a href="http://javax.microedition.io">javax.microedition.io</a>.<em>;

import <a href="http://java.io">java.io</a>.</em>;
public class ConnectionImage extends MIDlet implements CommandListener

{

Display tela;

//   form onde será exibida a imagem

Form imageForm;

//   ImageItem onde a foto que virá do servidor será salva.

ImageItem foto;

//   comandos

Command buscarCommand, sairCommand;

//   string com a url para a imagem

//   colocamos a url diretamente aqui somente para exemplo

//   uma idéia seria vc deixar o usuario setar esse link

//   em um textbox ou algo do genero.

String url = <a href="http://localhost/Site/logo.png">http://localhost/Site/logo.png</a>”;
public ConnectionImage() {

this.imageForm = new Form("");

//      imageItem onde será posta a imagem que vier do server

//      inicializamos ela com zero.

//      o qual poderia ser feito na hora de postar.

this.foto = new ImageItem(foto”,null,0,"");

this.sairCommand = new Command(Sair”, Command.EXIT, 0);

this.buscarCommand = new Command(Buscar”, Command.SCREEN, 1);

this.imageForm.addCommand(this.sairCommand);

this.imageForm.addCommand(this.buscarCommand);

this.imageForm.setCommandListener(this);

}
public void startApp() {

this.tela = Display.getDisplay(this);

this.tela.setCurrent(this.imageForm);

}

public void pauseApp() {
}

public void destroyApp(boolean bool) {
}

public void commandAction(Command c, Displayable d)   {

if (c == this.sairCommand)

{

this.destroyApp(true);

this.notifyDestroyed();

}

else if(c == buscarCommand)

{

//         se já houver um ImageItem no form

//         ele irá deleta-lo antes de jogar uma nova imagem

if (imageForm.size() > 0){

for (int i = 0; i < imageForm.size(); i++)

imageForm.delete(i);

}

try

{

Image im;

//            chama o método que busca a imagem

im = getImage(this.url);

this.foto.setImage(im);

imageForm.append(this.foto);

//            Display the form with the image

this.tela.setCurrent(imageForm);

}catch(Exception e)

{

}

}

}
/*--------------------------------------------------

* Abre uma conexão http e baixa um arquivo png

* em um array de bytes

<em>-------------------------------------------------</em>/

private Image getImage(String url) throws IOException

{

//      usamos aqui ao invés de httpconnection

//      a conexao padrao, o qual nao nos garante nada.

//      embora a conexao http tambem nao seja muito confiavel.

ContentConnection connection = (ContentConnection) Connector.open(url);

DataInputStream iStrm = connection.openDataInputStream();

Image im = null;

try

{

byte imageData[];

int length = (int) connection.getLength();

if (length != -1)

{

imageData = new byte[length];

//            Le um png em um array

iStrm.readFully(imageData);

}

else //se o tamanho não está disponível

{

ByteArrayOutputStream bStrm = new ByteArrayOutputStream();

int ch;

while ((ch = iStrm.read()) != -1)

bStrm.write(ch);

imageData = bStrm.toByteArray();

bStrm.close();

}

//         Cria a imagem de um array de bytes

im = Image.createImage(imageData, 0, imageData.length);

}

finally

{

//         Clean up

if (iStrm != null)

iStrm.close();

if (connection != null)

connection.close();

}

return (im == null ? null : im);

}

}

Grato pela atenção!

Wellington Candeia

4 Respostas

C

Olá Wellington,
Bom… primeiro isso é um Warning, o que significa que vai funcionar, mas que é recomendável vc fazer conexão em outra Thread.
Bom… vamo lá…
Pq isso??? Como ele mesmo falou, para evitar deadlock, ou seja, para que a tua aplicação não fique “travada” esperando as acoes da conexao.
Para que isso não aconteça, vc faz a conexao em outra Thread.
Bom… vamo lá:

Primeiro vc precisa colocar Runnable no implements da classe onde vc vai fazer a conexao.
Runnable é uma interface, e ela precisa que vc implemente o método run()
logo vc fará o seguinte:

public void run&#40;&#41; &#123; this.conectar&#40;&quot;http&#58;//www.portaljava.com&quot;&#41;; &#125;

Sendo que este método conectar vc irá faze-lo, a partir desse teu exemplo de conexao.

aí no seu commandAction vc faz:

Thread minhathread=new Thread&#40;this&#41;; minhathread.start&#40;&#41;;

Ou seja, vc vai criar uma nova Thread(linha de execução) e irá iniciá-la, ou seja, vai rodar o método run() que no nosso caso, vai fazer a conexao. Aí não temos mais que esperar a conexão pra executar alguma outra coisa que queremos!

Mas como eu disse no inicio, é só um Warning, vc não precisa obedeçer se não kiser… mas as consequencias é de sua responsabilidade!

Ok?!?

Até Mais!!!

W

Saudações!
Obrigado pela resposta clv, mas ainda tenho algumas dúvidas. Por exemplo, eu só uso o WTK da Sun e o JCreator para editar meus códigos. Para conexões eu não precisaria de mais algum programa ou esses são suficientes?Quero dizer, não preciso de algo tipo, Apache, sei lá, um servidor web? Quero postar novamente o código e lhe mostrar o endereço o qual tentei mostrar a foto na tela. Aparece no emulador uma mensagem perguntando com um botão buscar e outro sair, com um sinal de interrogação e dizendo que meu aplicativo “ConnectionImage wants to send and receive data using the network. This will use airtime and may result in charges.
Is it OK to use airtime?”.
Aí tanto faz eu clicar em yes ou no, que não acontece nada.
A imagem do site não vai aparecer nunca, isto é, o emulador só serve p/ simular e não conecta de verdade?

//ExemploConnectionImage

import javax.microedition.lcdui.<em>;

import javax.microedition.midlet.</em>;

import <a href="http://javax.microedition.io">javax.microedition.io</a>.<em>;

import <a href="http://java.io">java.io</a>.</em>;

public class ConnectionImage extends MIDlet implements CommandListener

{

Display tela;

//form onde será exibida a imagem

Form imageForm;

//ImageItem onde a foto que virá do servidor será salva.

ImageItem foto;

//comandos

Command buscarCommand, sairCommand;

//string com a url para a imagem

//colocamos a url diretamente aqui somente para exemplo

//uma idéia seria vc deixar o usuario setar esse link

//em um textbox ou algo do genero.

String url = <a href="http://esl.eng.ohio-state.edu/~csg/applications/antennas/arrays/vivaldi-array-DD/FEBI/10x10/vi10x10geo_sm.png">http://esl.eng.ohio-state.edu/~csg/applications/antennas/arrays/vivaldi-array-DD/FEBI/10x10/vi10x10geo_sm.png</a>”;

public ConnectionImage()

{

this.imageForm = new Form("");

//imageItem onde será posta a imagem que vier do server

//inicializamos ela com zero.

//o qual poderia ser feito na hora de postar.

this.foto = new ImageItem(foto,null,0,"");

this.sairCommand = new Command(Sair, Command.EXIT, 0);

this.buscarCommand = new Command(Buscar, Command.SCREEN, 1);

this.imageForm.addCommand(this.sairCommand);

this.imageForm.addCommand(this.buscarCommand);

this.imageForm.setCommandListener(this);

}

public void startApp()

{

this.tela = Display.getDisplay(this);

this.tela.setCurrent(this.imageForm);

}

public void pauseApp()

{

}

public void destroyApp(boolean bool)

{

}

public void commandAction(Command c, Displayable d)

{

if (c == this.sairCommand)

{

this.destroyApp(true);

this.notifyDestroyed();

}

else if(c == buscarCommand)

{

//se já houver um ImageItem no form

//ele irá deleta-lo antes de jogar uma nova imagem

if (imageForm.size() > 0){

for (int i = 0; i < imageForm.size(); i++)

imageForm.delete(i);

}

try

{

Image im;

//chama o método que busca a imagem

im = getImage(this.url);

this.foto.setImage(im);

imageForm.append(this.foto);

// Display the form with the image

this.tela.setCurrent(imageForm);

}catch(Exception e)

{

}

}

}

/*--------------------------------------------------
  • Abre uma conexão http e baixa um arquivo png
  • em um array de bytes
    -------------------------------------------------/
    private Image getImage(String url) throws IOException
    {
    //usamos aqui ao invés de httpconnection
    //a conexao padrao, o qual nao nos garante nada.
    //embora a conexao http tambem nao seja muito confiavel.
    ContentConnection connection = (ContentConnection) Connector.open(url);
    DataInputStream iStrm = connection.openDataInputStream();
    Image im = null;
    try
    {
    byte imageData[];
    int length = (int) connection.getLength();
    if (length != -1)
    {
    imageData = new byte[length];
    // Le um png em um array
    iStrm.readFully(imageData);
    }
    else //se o tamanho não está disponível
    {
    ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
    int ch;
    while ((ch = iStrm.read()) != -1)
    bStrm.write(ch);
    imageData = bStrm.toByteArray();
    bStrm.close();
    }
    //Cria a imagem de um array de bytes
    im = Image.createImage(imageData, 0, imageData.length);
    }
    finally
    {
    // Clean up
    if (iStrm != null)
    iStrm.close();
    if (connection != null)
    connection.close();
    }
    return (im == null ? null : im);
    }
    }

Obrigado pela atenção mais uma vez!

Wellington Candeia

C

O emulador faz conexão sim!!!
Vc não precisa de nenhum outro programa não!
Mas se vc tiver um web server é melhor… ai vc coloca o conteudo kiser nele e ai baxar pelo teu aplicativo!!!

Dica:Baixe strings para teste… depois vc faz baxar imagens!!!

Até!!

L

eu tb estou com uma duvida sera que vc pode me ajudar!

vou precisar fazer um software que conecta em um site da faculdade www.fai.com.br e ao aluno entra com seu RA e DT de Nasc ela vai ver em seu visor sua notas tem como fazer isso!
me falaram que tenho que fazer um siteseparado em php so com as notas
se alguem manjar em PHP e puder me dar uma dica eu agradeco tem como eu fazer um site em PHP que puxe os dados das notas no banco de dados do servidor da fai. :eek:

Criado 12 de agosto de 2004
Ultima resposta 20 de ago. de 2004
Respostas 4
Participantes 3