1

我想从 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,问题会得到解决吗?

4

3 回答 3

2

如果我确实在单独的线程中创建 HttpConnection,问题会得到解决吗?

如果你做得对 - 是的,问题将得到解决。这是一个典型的问题,有标准的解决方案。

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

避免 UI 事件线程中的负载过重。commandAction当or keyPressedor etc内部有很多事情要做时pointerPressed,只需生成一个新线程即可。为了更好地理解为什么会这样,请考虑学习本教程以了解如何正确地做到这一点:

网络、用户体验和线程

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

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

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

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

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

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

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

于 2012-07-26T14:34:34.380 回答
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();
于 2012-07-26T11:37:25.150 回答
-2


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

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


在 J2ME 中(j2me 的所有者 Sun/oracle)给出了一些限制。为了安全,一些 API 需要受信任方证书。为此,一些手机在用户单击“是”时会询问用户许可,否则它将不允许。
以下是一些 API 是在 FileConnection(读取/写入文件)api、HttpConnection、HttpsConnection 等场景下出现的。
你检查你的设备是否支持自签名证书。如果支持意味着你使用自签名证书。
可信方证书成本高昂。其最低成本为每年 10000 卢比。以下是一些可信方供应商 Thawte、Verizon、Semantec 等

于 2012-07-26T09:16:10.337 回答