3

私はBBのプロジェクトを開発しています。アプリケーションはネットワークと連携し、HTTP経由でデータを送受信します。ここで、キューとキューマネージャーを使用します。Managerはバックグラウンドスレッドで開始し、while(true)ループで動作し、サーバーへの新しいトランザクションのキューをチェックします。キューが空でない場合、トランザクションが実行されます。空でない場合、マネージャーは200ミリ秒間スリープ状態になります。

トランザクションのプロセスは次のとおりです。-別のスレッドを(Runnableを使用して)実行します。これにより、ネットワークへの接続が開かれ、最初のスレッドがバックグラウンドスレッドまたはタイムアウト(ループが必要)を待機します。これを設定します。-接続が確立されると、getResponseCode()を実行する別のスレッドを(Runnableを使用して)開始し、最初のスレッドがバックグラウンドスレッドまたはタイムアウトを待機します(そのためにループが必要です)。

その前に、wait-rotating-imageを含むポップアップウィンドウを表示し、その後、それを削除します。Application.getEventLock()を介して同期しました。

不安定な場合があり、スレッドが長時間スリープする場合は、timeout-waiting-loopを無視してください。

そのようなアプローチがどれほど有効であるか、どのようなアドバイスとベストプラクティスがあり、あなたの経験は何ですか?

4.5、4.6、4.7、5.0を使用しています。

4

2 に答える 2

2

によって返されるロックApplication.getEventLock()は、UIまたはUIコンポーネントを変更するコードにのみ使用する必要があります。これは、イベントディスパッチャーによって使用されるロックです。HTTP処理などのバックグラウンドタスクには使用しないでください。そのコードを同期したい場合は、独自のロックオブジェクトを作成するのが最善です。

于 2010-03-05T17:07:22.690 に答える
1

それほど多くのスレッドは必要ありません。EDT(イベントディスパッチスレッド、別名メインスレッド)はジョブ(一部の実行可能なクラス)をキューに挿入し、待機/通知を使用して、ネットワークトランザクションを担当する専用のワーカースレッドに通知する必要があります。キューを確認してください。ワーカースレッドは、接続のオープン、接続への書き込み、および接続からの読み取りを担当します。

待機/通知メカニズムのチェックアウトについて は、Javaでwait()とnotify()を使用する簡単なシナリオを参照してください。

ワーカースレッドを使用してUIを更新できないため、ネットワークトランザクションが完了したら、InvokeLaterを使用してUIレイヤーを更新できます。

詳細については、http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/system/Application.html#invokeLater(java.lang.Runnable)にアクセスしてください。

HTTPConnection自体でタイムアウトを設定できますが、そのメカニズムに依存したくない場合は、しばらくして実行され、応答が受信されない場合にタイムアウトを処理するTimerTaskをスケジュールできます。応答を受信したら、TimerTaskをキャンセルして、タイムアウトがトリガーされないようにするだけです。

http://www.blackberry.com/developers/docs/4.0api/java/util/TimerTask.htmlをチェックしてください

于 2013-09-16T05:31:02.783 に答える