为什么J2ME Midlet Suite和HTTPConnection需要位于不同的线程中

时间:2012-07-26 07:22:56

标签: multithreading networking java-me midp eclipseme

我想从J2ME midlet调用一个Servlet,所以我已经编写了Servlet URL的HTTPConnection代码来调用GET方法。

当Midlet套件尝试连接到Servlet URL时,我在模拟器中收到以下消息,

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

如果我点击“否”或“是”,则没有任何事情发生,它刚被绞死,我使用的是EclipseME和SUN WTK 2.5.2。在控制台中有一个警告,

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

这意味着,如果我在单独的线程中进行HttpConnection,问题是否会解决?

3 个答案:

答案 0 :(得分:2)

  

如果我在单独的线程中进行HttpConnection,问题是否会解决?

如果你做对了 - 是的,问题就会解决。这是一个典型的问题,并且有一个独立的解决方案。

警告您指的是midlet中的设计问题。你有“重量级”活动(http连接),它在与UI相同的线程中运行,阻止它并使其无法响应。

避免UI事件线程中的重载。当commandActionkeyPressedpointerPressed等内容有很多内容时,只需生成一个新线程即可。为了更好地理解为什么,请考虑学习本教程以了解如何正确地做到这一点:

Networking, User Experience, and Threads

  

本文介绍了MIDlet如何在不影响用户界面的情况下建立网络连接。它包括六个迭代示例,说明多线程网络和等待屏幕的使用......

  • 在教程中的第一个示例(PrimitiveMidlet)之后,甚至会对您遇到的问题进行详细说明:

      

    ...程序员已经劫持了一个系统线程,用于他自己的冗长处理。当用户选择命令时,系统调用其commandAction()方法。调用此方法的线程属于系统,而不属于开发人员。如果方法快速执行,这不会构成犯罪,但在这种情况下,网络连接可能会长时间占用系统的线程。

         

    在J2SE应用程序编程中,甚至在servlet编程中,系统都会为您创建一个线程,并且对您的处理时间的限制几乎没有限制。 MIDlet线程的规则简单而严格:属于您的唯一线程就是您自己创建的线程。

         

    在MIDlet中,您正在编写系统将从其自己的一个线程调用的代码。例如,当调用MIDlet的startApp(),pauseApp(),destroyApp()和事件处理程序方法时,它们在系统线程内运行。您的方法必须快速返回,以便系统线程可以继续其他工作。任何无法快速完成的任务都必须移出系统的线程。

         

    这种编程风格可能需要一些时间来习惯,因为您实际上只编写从系统线程调用的代码。但是,如果您已经完成了任何其他GUI编程,那么这种技术将会很熟悉。 AWT和Swing有一个事件调度线程,用于处理操作系统事件并在代码中调用事件处理程序。规则是相同的:事件处理程序应该快速执行并将控制权返回给事件派发线程,以便接口的其余部分不会锁定...

  •   
  教程中的更多代码示例展示了如何修复上述设计错误以及如何使MIDlet用户界面与网络活动平滑地互操作。

答案 1 :(得分:1)

将其连接创建为单独的线程,如下所示:

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();

答案 2 :(得分:-2)


在J2ME中,网络操作被置于单独的线程中。
U将网络模块放在一个单独的线程中。如果你将网络模块放在单独的线程中,则不会出现以下消息。

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


在J2ME(sun / oracle谁是j2me的所有者)给出了一些限制。为了安全起见,一些API需要可信方证书。为此,一些手机在用户点击是时允许用户获得许可然后它将允许,否则不允许。
以下是API的一些内容,即FileConnection(读/写文件)api,HttpConnection,HttpsConnection等。
你检查你的设备是否支持自签名证书。如果支持意味着你使用自签名证书。
可信方证书价格昂贵。最低成本为每年10000卢比。以下是一些可信赖的供应商Thawte,Verizon,Semantec等