Multithreading 为什么J2ME Midlet套件和HTTPConnection需要在不同的线程中
我想从J2ME midlet调用一个Servlet,因此我已经为Servlet URL编写了HTTPConnection代码,以调用GET方法 当Midlet suites尝试连接到Servlet URL时,我在Emulator中收到以下消息Multithreading 为什么J2ME Midlet套件和HTTPConnection需要在不同的线程中,multithreading,networking,java-me,midp,eclipseme,Multithreading,Networking,Java Me,Midp,Eclipseme,我想从J2ME midlet调用一个Servlet,因此我已经为Servlet URL编写了HTTPConnection代码,以调用GET方法 当Midlet suites尝试连接到Servlet URL时,我在Emulator中收到以下消息 {#MyMidlet} Midlet Suite wants to connect to {#Servlet URL} using air time, this may result in charges, Is it ok to use airtim
{#MyMidlet} Midlet Suite wants to connect to {#Servlet URL} using air time,
this may result in charges, Is it ok to use airtime ?
如果我单击“否”或“是”,则什么都没有发生,只是挂起了,我使用的是日食和太阳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,那么问题会得到解决吗?
在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中(sun/oracle是J2ME的所有者)给出了一些限制。为了安全起见,一些API需要可信方证书。为此,一些手机在用户单击“是”时请求用户许可,然后它将允许,否则它将不允许。
以下是一些API所属的场景:FileConnection(读/写文件)API、HttpConnection、HttpsConnection等。
检查您的设备是否支持自签名证书。如果支持,则表示您使用自签名证书。
可信方证书的成本很高。它的最低成本是每年10000卢比。以下是一些可信方供应商Thawte、Verizon、Semantec等。在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中(sun/oracle是J2ME的所有者)给出了一些限制。为了安全起见,一些API需要可信方证书。为此,一些手机在用户单击“是”时请求用户许可,然后它将允许,否则它将不允许。
以下是一些API所属的场景:FileConnection(读/写文件)API、HttpConnection、HttpsConnection等。
检查您的设备是否支持自签名证书。如果支持,则表示您使用自签名证书。
受信任方证书的成本很高。其最低成本为每年10000卢比。以下是一些受信任方供应商Thawte、Verizon、Semantec等将其连接创建为单独的线程,如下所示:
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();
将其连接创建为单独的线程,如下所示:
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();
如果我在一个单独的线程中创建HttpConnection,这个问题会得到解决吗
如果你做对了——是的,问题就会解决。这是一个典型的问题,有标准的解决方案
您提到的警告表示midlet存在设计问题。您的“重量级”活动(http连接)与UI在同一线程中运行,阻塞它并使其不负责任
避免UI事件线程中的重载。当commandAction
或按键
或指针压缩
等内部有很多事情要做时,只需生成一个新线程即可。为了更好地理解这一点,请考虑学习本教程,找出如何正确处理:
本文介绍了MIDlet如何在不影响用户界面的情况下进行网络连接。它包括六个迭代示例,说明了多线程网络和等待屏幕的使用
- 在本教程的第一个示例(
)之后,甚至有一个关于您遇到的问题的详细说明: …程序员劫持了一个系统线程以进行自己漫长的处理。当用户选择命令时,系统调用他的commandAction()方法。调用此方法的线程属于系统,而不是开发人员。如果快速执行该方法,则不会构成犯罪,但在这种情况下,网络连接可能占用系统线程很长时间 在J2SE应用程序编程中,甚至在servlet编程中,系统都会为您创建一个线程,并且对您的处理时间几乎没有限制。MIDlet线程的规则既简单又严格:只有属于您的线程是您自己创建的 在MIDlet中,您正在编写系统将从自己的线程之一调用的代码。例如,当调用MIDlet的startApp()、pauseApp()、destroyApp()和事件处理程序方法时,它们在系统线程内运行。您的方法必须快速返回,以便系统线程可以继续它的其他工作。任何不能快速完成的任务都必须移出系统线程 这种编程风格可能需要一些时间才能习惯,因为您实际上只编写从系统线程调用的代码。但是,如果您曾经进行过任何其他GUI编程,那么这种技术将很熟悉。AWT和Swing有一个事件调度线程,用于处理操作系统事件并在代码中调用事件处理程序。规则是一样的:事件处理程序应该快速执行,并将控制权返回到事件调度线程,以便接口的其余部分不会锁定PrimitiveMidlet
命令操作
或按键
或指针按下
e中有很多事情要做时