私は、さまざまなベンダーの携帯電話に移植する必要がある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を更新するスレッドでこの問題をどのように解決できますか?
おかげで、 ズラトコ
ご回答いただきありがとうございます。私の最初のアプローチは、あなたが指摘した仕様を念頭に置いて、あなたが提案したようにUIをワーカースレッドから直接更新することでした。それは機能していませんでした。それが、私が私の投稿に書いたものを含め、他の解決策を探すことになったのです。 – Bart
ユースケースをより明確にする:スプラッシュ画面の目的で、アプリの起動時に画像が表示されます。その時点で、私は5秒待ってからpaint()メソッドで使用するイメージを変更し、repaint()を呼び出す新しいスレッドを生成します。しかし、2番目の画像は決して表示されませんが、最初の画像(スプラッシュ)は表示されます。 repaint()は2回目に実行されないか、ブロックされているようです(このコードは他の多くのデバイス上で完璧に動作します)。何か案は? – Bart
イベントスレッドがブロックされている可能性があります。コードを見せてくれますか? –