2016-12-30 4 views
1

私は、画面サイズに合わせて拡大縮小された任意の画像を表示するアプリケーションを開発しようとしています。しかし、EDTで画像を拡大するとUIがかなり表示されるので、次のコードを使用してバックグラウンドスレッドで画像を拡大することにしました。コードネーム1の画像をスケーリングするときにEDT違反が検出されました

final Runnable updateUI = new Runnable() { 
     public void run() { 
      //Update the UI here 
     } 
    }; 
    Runnable r = new Runnable() { 
     public void run() { 
      Image i = Resources.getGlobalResources().getImage("apple-icon.png"); 
      i.scaled(50, 40); 
      //Display.getInstance().callSerially(updateUI); 
      //This line of code is not related to the EDT error 
     } 
    }; 
    new Thread(r).start(); 

しかし、画像にもかかわらずは(まだ)GUI上にない、シミュレータは、コンソールで次のエラー(繰り返し数百回、時には不完全なスタックが印刷された)を示しています

EDT violation detected! 
com.codename1.impl.javase.JavaSEPort$EDTViolation: EDT Violation Stack! 
    at com.codename1.impl.javase.JavaSEPort.checkEDT(JavaSEPort.java:545) 
    at com.codename1.impl.javase.JavaSEPort.getImageWidth(JavaSEPort.java:3945) 
    at com.codename1.ui.Image.getWidth(Image.java:689) 
    at com.codename1.ui.EncodedImage.getWidth(EncodedImage.java:511) 
    at com.codename1.ui.EncodedImage.scaledEncoded(EncodedImage.java:600) 
    at com.codename1.ui.EncodedImage.scaled(EncodedImage.java:653) 
    at com.mycompany.myapp.MyApplication$1.run(MyApplication.java:81) 
    at java.lang.Thread.run(Thread.java:745) 

この場合、私は疑問に思います私のコードの動作やバグが予想され、このエラーを取り除く方法は?ご意見をお聞かせください。

答えて

0

警告にもかかわらず一般的に動作するはずですが、実際には私たちのコードはそれを正確に行い、EDT警告を生成します。

実装層に到達せずにEDT違反が発生する可能性があるため、EDT違反の検出は不正確です。そういうわけで私たちは熱心に過ごすことを選択し、マークを完全に紛失するよりも「偽陽性」を持つことを好みます。

スケーリングはEDTで機能するはずですが、他の画像操作ではそうではないかもしれないことに注意してください。例えば。バックグラウンドでの画像の描画は、iOSでは非常にうまくいかないことがあります。

+0

私はこの古い質問に明確な説明をします:EDTから働く(または働かない)操作の一覧はありますか? 「EDT違反」については、[手動セクション](https://www.codenameone.com/manual/edt.html#_debugging_edt_violations)は一般的なものであり、画像操作については何も言及していません。 –

+1

EDT以外の画像は公式にはサポートされていないため、記載されていません。 EDTまたはスレッドセーフであると予想されるメソッドは、JavaDocで明示的に言及されています。 EDTには常に他のすべてがあるはずです –

関連する問題