Pergunta

Quero chamar um servlet do midlet J2ME, então escrevi o código HTTPConnection para o URL do servlet para chamar o método GET.

Quando os pacotes Midlet tentam se conectar ao URL do Servlet, recebo a mensagem abaixo no emulador,

{#MyMidlet} Midlet Suite wants to connect to {#Servlet URL} using air time,
  this may result in charges, Is it ok to use airtime ?

Se eu clicar em Não ou Sim, nada aconteceu, apenas travou, estou usando EclipseME e SUN WTK 2.5.2.E no console havia um aviso,

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 que se eu fizer o HttpConnection em um thread separado, o problema será resolvido?

Foi útil?

Solução

Se eu fizer o HttpConnection em um thread separado, o problema será resolvido?

Se você fizer certo, sim, o problema será resolvido.Este é um problema típico e existe uma solução padrão.

O aviso ao qual você se refere indica problema de design em seu midlet.Você tem atividade "pesada" (conexão http) que é executada no mesmo thread da interface do usuário, bloqueando-a e tornando-a irresponsiva.

Evite carga pesada no thread de eventos da UI.Quando há muito o que fazer em algo dentro de commandAction ou keyPressed ou pointerPressed etc, basta gerar um novo tópico para fazer isso.Para entender melhor o porquê disso, considere estudar este tutorial para descobrir como fazer isso da maneira certa:

Rede, experiência do usuário e threads

Este artigo explica como seu MIDlet pode fazer conexões de rede sem comprometer sua interface de usuário.Inclui seis exemplos iterativos que ilustram redes multithread e o uso de uma tela de espera...

  • Após o primeiro exemplo do tutorial (PrimitiveMidlet), há até uma explicação detalhada do problema que você está enfrentando:

    ...o programador sequestrou um thread do sistema para seu próprio processamento demorado.O sistema chama seu método commandAction() quando o usuário seleciona um comando.O thread que chama esse método pertence ao sistema, não ao desenvolvedor.Isso não seria crime se o método fosse executado rapidamente, mas neste caso, a conexão de rede pode sobrecarregar o thread do sistema por um longo tempo.

    Na programação de aplicativos J2SE e até mesmo na programação de servlets, o sistema cria um thread para você e há poucas restrições sobre quanto tempo seu processamento pode levar.A regra de threading de MIDlet é simples e estrita:os únicos tópicos que pertencem a você são aqueles que você mesmo cria.

    Em um MIDlet, você está escrevendo um código que o sistema chamará de uma de suas próprias threads.Quando os métodos startApp(), pauseApp(), destroyApp() e manipulador de eventos do seu MIDlet são chamados, por exemplo, eles são executados dentro de um thread do sistema.Seus métodos devem retornar rapidamente para que o thread do sistema possa continuar seu outro trabalho.Qualquer tarefa que não possa ser concluída rapidamente deve ser retirada do thread do sistema.

    Pode levar algum tempo para se acostumar com esse estilo de programação, já que na verdade você está apenas escrevendo código que é chamado a partir dos threads do sistema.Entretanto, se você já fez qualquer outra programação GUI, essa técnica será familiar.AWT e Swing possuem um thread de despacho de eventos que manipula eventos do sistema operacional e chama manipuladores de eventos em seu código.A regra é a mesma:manipuladores de eventos devem ser executados rapidamente e retornar o controle ao thread de envio de eventos para que o restante da interface não seja bloqueado...

Outros exemplos de código no tutorial mostram como corrigir erros de design como acima e como fazer com que a interface do usuário do MIDlet interopere suavemente com as atividades de rede.

Outras dicas

Cria sua conexão como um thread separado como este:

Thread myConnection = new Thread(new Runnable() {

        public void run() {
            // TODO open connection here


            HttpConnection conn = null;

            try {

                        conn = (HttpConnection) Connector.open(serverURL,
                                Connector.READ_WRITE, true);

                        conn.setRequestMethod(HttpConnection.GET); // or POST method

                    } catch (Exception e) {

                // TODO: handle exception

            } finally {

                // close connection here
            }

        }
    });
    myConnection.start();


No J2ME a operação de rede é colocada em thread separado.
Você colocou o módulo de rede em um thread separado. Se você colocar o módulo de rede em um thread separado, a seguinte mensagem não aparecerá.

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


No J2ME (sun/oracle que é o proprietário do j2me) dá algumas limitações. Para segurança, algumas APIs precisam de certificados de terceiros confiáveis.
A seguir estão algumas das APIs em que os cenários são FileConnection (leitura/gravação em arquivo), API, HttpConnection, HttpsConnection, etc.
Você verifica se seu dispositivo é compatível com certificado autoassinado. Se for compatível, significa que você usa certificado autoassinado.
O certificado de entidade confiável é caro. Seu custo mínimo é de 10.000 rúpias por ano. A seguir estão alguns fornecedores de terceiros confiáveis: Thawte, Verizon, Semantec, etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top