1

J2MEミッドレットからサーブレットを呼び出したいので、GETメソッドを呼び出すサーブレットURLの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とSUNWTK2.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を作成した場合、問題は解決しますか?

あなたがそれを正しく行えば-はい、問題は解決されます。これは典型的な問題であり、標準的な解決策があります。

参照する警告は、ミッドレットの設計上の問題を示しています。UIと同じスレッドで実行される「ヘビーウェイト」アクティビティ(http接続)があり、それをブロックして応答しなくなります。

UIイベントスレッドの重い負荷を避けてください。commandActionorkeyPressedまたはetcの内部で何かすることがたくさんある場合は、それを行うpointerPressedために新しいスレッドを生成するだけです。その理由をよりよく理解するために、このチュートリアルを調べて、それを正しく行う方法を見つけることを検討してください。

ネットワーキング、ユーザーエクスペリエンス、およびスレッド

この記事では、MIDletがユーザーインターフェイスを損なうことなくネットワーク接続を確立する方法について説明します。マルチスレッドネットワークと待機画面の使用を示す6つの反復例が含まれています...

  • チュートリアルの最初の例(PrimitiveMidlet)の後に、発生している問題の詳細な説明もあります。

    ...プログラマーは、彼自身の長い処理のためにシステムスレッドを乗っ取った。ユーザーがコマンドを選択すると、システムは彼のcommandAction()メソッドを呼び出します。このメソッドを呼び出すスレッドは、開発者ではなくシステムに属しています。メソッドが迅速に実行されれば、これは犯罪ではありませんが、この場合、ネットワーク接続がシステムのスレッドを長時間占有する可能性があります。

    J2SEアプリケーションプログラミングやサーブレットプログラミングでも、システムがスレッドを作成し、処理にかかる時間に制限はほとんどありません。MIDletスレッドのルールは単純で厳密です。自分に属するスレッドは、自分で作成したスレッドだけです。

    MIDletでは、システムが独自のスレッドの1つから呼び出すコードを記述しています。たとえば、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には信頼できるパーティの証明書が必要です。このため、一部のモバイルでは、ユーザーが[はい]をクリックすると許可を求めます。それ以外の場合は許可しません。
以下は、FileConnection(ファイルの読み取り/書き込み)api、HttpConnection、HttpsConnectionなどのシナリオに該当するAPIの一部です。
デバイスが自己署名証明書をサポートしているかどうかを確認します。サポートがある場合は、自己署名証明書を使用することを意味します。
信頼できるパーティの証明書は高額です。最小コストは年間10000ルッピーです。以下は、Thawte、Verizon、Semantecなどの信頼できるパーティベンダーです。

于 2012-07-26T09:16:10.337 に答える