2011-01-24 10 views
2

私は、さまざまなベンダーの携帯電話に移植する必要があるJ2MEアプリケーションを開発しています。これまでのところ、アプリケーションはMotorola V3(これは私が試したモトローラの唯一の携帯電話)以外は正常に動作しています。ワーカースレッドがMotorola V3のUIを更新できない

問題は、新しいスレッドを開始し、スレッドが(repaint()を呼び出して)グラフィックスを更新しようとすると、グラフィックシステムがスタックになることです。

有用な情報: - 私は、Midletのコンストラクタでディスプレイを取得し、アプリケーションの寿命中に再利用しています。 - キャンバスを拡張するクラスは1つだけです。あらゆる描画がここで行われます。グラフィックを再描画したいときは、UIスレッドまたは別のワーカースレッドからrepaint()メソッドを呼び出します。私が知る限り、すべてのスレッドは問題なくUIにアクセスできます。 - 私は、アプリケーションの冒頭で、実行中の(UI)スレッドの名前を取得し、後で使用できるように保存するという修正を試みました。 repaint()が呼び出される前に、現在のスレッドの名前がUIスレッドの名前と等しいかどうかを確認します。それは頌歌場合、私は、他の私はrepaint()ないでください:

display.callSerially(new Runnable() { 
    public void run() { 
     repaint(); 
    } 
}); 

あなたは私にJ2MEのモトローラのimplemenationで任意の詳細を指しますか? UIを更新するスレッドでこの問題をどのように解決できますか?

おかげで、 ズラトコ

答えて

3

は、Swingとは異なり、MIDPユーザーインターフェースAPIは、スレッドセーフです。これは、UIスレッドで動作させるためにcallSeriallyを使用する必要がないことを意味します。 callSeriallyが一部のMotorolaデバイスでうまく動作しないという報告があります。したがって、あなた自身のベストプラクティスは、それだけで再描画を呼び出すことです。

再塗りつぶしは、再塗りつぶしを行うためのシステムへの提案に過ぎないことに注意してください。再ペイントを直ちに実行させたい場合は、serviceRepaintsメソッドを呼び出す必要があります。

MIDPのUIイベント処理の詳細については、hereを参照してください。

+0

ご回答いただきありがとうございます。私の最初のアプローチは、あなたが指摘した仕様を念頭に置いて、あなたが提案したようにUIをワーカースレッドから直接更新することでした。それは機能していませんでした。それが、私が私の投稿に書いたものを含め、他の解決策を探すことになったのです。 – Bart

+0

ユースケースをより明確にする:スプラッシュ画面の目的で、アプリの起動時に画像が表示されます。その時点で、私は5秒待ってからpaint()メソッドで使用するイメージを変更し、repaint()を呼び出す新しいスレッドを生成します。しかし、2番目の画像は決して表示されませんが、最初の画像(スプラッシュ)は表示されます。 repaint()は2回目に実行されないか、ブロックされているようです(このコードは他の多くのデバイス上で完璧に動作します)。何か案は? – Bart

+0

イベントスレッドがブロックされている可能性があります。コードを見せてくれますか? –

関連する問題