2012-07-26 45 views
1

我想从J2ME midlet中调用一个Servlet,所以我编写了Servlet URL的HTTPConnection代码来调用GET方法。为什么J2ME Midlet Suite和HTTPConnection需要使用不同的线程

当MIDlet套件试图连接到服务器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,将问题解决呢?

+2

试试看! – funkybro 2012-07-26 07:27:49

+0

它的工作,当我改变HttpConnection在不同的线程。谢谢 !! – Murugesh 2012-07-26 13:47:40

+0

没问题!虽然下次我只是自己尝试一下,而不必在这里发布问题......节省了很多时间! – funkybro 2012-07-26 14:10:55

回答

2

如果我在一个单独的线程中制作HttpConnection,问题是否会得到解决?

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

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

在UI事件线程中避免重载。当commandActionkeyPressedpointerPressed等内部有很多东西需要做时,只需创建一个新线程即可完成。为了更好地理解这是为什么,考虑研究本教程以了解如何做是正确的:

Networking, User Experience, and Threads

本文介绍了你的MIDlet如何进行网络连接,而不影响您的用户界面。它包含六个迭代示例,说明多线程网络和使用等待屏幕......

  • 教程(PrimitiveMidlet)的第一个例子后,有您所遇到的问题,甚至是一个详细的解释:

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

    在J2SE应用程序,甚至在servlet编程,系统将为您创建一个线程,也有你的处理可以多久一些限制。 MIDlet线程的规则是简单而严格的:唯一属于你的线程就是你自己创建的线程。

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

    这种编程方式可能需要一些时间来适应,因为你真的只写一个从系统的线程调用的代码。但是,如果你已经完成了其他的GUI编程,这种技术将会很熟悉。 AWT和Swing有一个事件分派线程,它处理操作系统事件并在代码中调用事件处理程序。规则是一样的:事件处理程序应该迅速执行并返回控制到事件调度线程使接口的其余部分没有锁定...

  • 在教程中显示
另外的代码示例如何解决设计错误,类似于以及如何使MIDlet用户界面顺畅地与网络活动进行互操作。

-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(太阳/ ORACLE谁是J2ME的所有者)给出了一些limitations.For安全一些API的需要可信方certificates.For一些这方面的手机询问用户权限时,用户点击是,那么它会允许,否则不允许。
以下是API下的一些场景,包括FileConnection(读/写文件)api,HttpConnection,HttpsConnection等。
U检查您的设备是否支持自签名证书。如果是支持方式,请使用自签名证书。
可信方证书是昂贵的。其最低的成本为10000 Ruppees每year.The以下是一些值得信赖方供应商Thawte的,Verizon公司,Semantec等

+1

所有的东西/权限是正确的,但不相关的 - 问题是无关的证书。 – funkybro 2012-07-26 10:24:34

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

谢谢你的回答,以我试过的类似的方式开始工作。你能告诉我,为什么当它们都在一个线程中时,就像这样给出信息。 – Murugesh 2012-07-26 13:50:11

+0

每个制造商定义你将如何处理它。这不是强制性的。例如,在仿真器WTK 2.5.2中,他对KVM进行仿真,主线程负责绘制。建议使用好的做法,但不要强制为事件I/O使用单独的线程。想象一下,当服务器不响应请求时,仅使用主线程运行应用程序(客户端/服务器)...可能会危及绘制的响应屏幕上。 – 2012-07-26 14:57:13

+0

然后,WTK模拟器强制执行一个单独的线程方法来运行。但真正的设备不是必需的。但是,在处理事件I/O时应小心。 – 2012-07-26 14:59:09

相关问题