Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 为什么J2ME Midlet套件和HTTPConnection需要在不同的线程中_Multithreading_Networking_Java Me_Midp_Eclipseme - Fatal编程技术网

Multithreading 为什么J2ME Midlet套件和HTTPConnection需要在不同的线程中

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

我想从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 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如何在不影响用户界面的情况下进行网络连接。它包括六个迭代示例,说明了多线程网络和等待屏幕的使用

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

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

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

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

    这种编程风格可能需要一些时间才能习惯,因为您实际上只编写从系统线程调用的代码。但是,如果您曾经进行过任何其他GUI编程,那么这种技术将很熟悉。AWT和Swing有一个事件调度线程,用于处理操作系统事件并在代码中调用事件处理程序。规则是一样的:事件处理程序应该快速执行,并将控制权返回到事件调度线程,以便接口的其余部分不会锁定
本教程中的进一步代码示例演示了如何修复上述设计错误,以及如何使MIDlet用户界面与网络活动顺利互操作

如果我在一个单独的线程中创建HttpConnection,这个问题会得到解决吗

如果你做对了——是的,问题就会解决。这是一个典型的问题,有标准的解决方案

您提到的警告表示midlet存在设计问题。您的“重量级”活动(http连接)与UI在同一线程中运行,阻塞它并使其不负责任

避免UI事件线程中的重载。当
命令操作
按键
指针按下
e中有很多事情要做时