Javascript Java UI线程被阻止-内存不足错误
在我的应用程序中,我每秒都会收到消息,其中包含高度、速度和航向。每次收到消息时,我都需要生成一个符号(jpg)并将其显示在桌面应用程序的UI中。下面是我使用的代码。出于某种原因,只要将下面的代码集成到应用程序中,我就会不断摆脱内存错误 为了摆脱它,我将创建bellow类的实例和调用createSymbol放在一个单独的线程中,并将svg到jpg转换成单独的线程。即使这样,问题也没有得到解决。我在想,因为这段代码是每秒执行一次的,所以在内存中加载javascript库milsymbol.js会导致这个问题 关于我的问题,我的理解正确吗?或者你认为会有什么问题 如果我的理解是正确的,有没有办法,我可以在内存中加载库一次,每次,我都可以引用已经加载的库来调用它的函数 你认为下面的代码有什么改进吗Javascript Java UI线程被阻止-内存不足错误,javascript,java,multithreading,Javascript,Java,Multithreading,在我的应用程序中,我每秒都会收到消息,其中包含高度、速度和航向。每次收到消息时,我都需要生成一个符号(jpg)并将其显示在桌面应用程序的UI中。下面是我使用的代码。出于某种原因,只要将下面的代码集成到应用程序中,我就会不断摆脱内存错误 为了摆脱它,我将创建bellow类的实例和调用createSymbol放在一个单独的线程中,并将svg到jpg转换成单独的线程。即使这样,问题也没有得到解决。我在想,因为这段代码是每秒执行一次的,所以在内存中加载javascript库milsymbol.js会导致
public class SymbolCreation {
private static final Logger log =
Logger.getLogger( UAVSymbolCreation.class );
int altitude;
int heading;
int speed;
public SymbolCreation(int altitude, int speed, int heading) {
this.altitude = altitude;
this.heading = heading;
this.speed = speed;
}
public void createSymbol() {
synchronized(this) {
File milSymbolLib = new File("config/4586controller/milsymbol.js");
if(milSymbolLib.exists()) {
try {
Reader libraryReader = new FileReader(milSymbolLib);
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");
scriptEngine.eval(libraryReader);
SymbolCreation symbolCreation = this;
scriptEngine.put("symbolCreation",symbolCreation);
scriptEngine.eval("function run(symbolCreation){var altitude = symbolCreation.getAltitude(); "
+ "var speedVal = symbolCreation.getSpeed(); "
+ "var heading = symbolCreation.getHeading();"
+ "symbolCreation.createSymbolSVG(new ms.Symbol('SFA-MFQ--------',{size:20, altitudeDepth:altitude, speed: speedVal , direction: heading}).asSVG());} run(symbolCreation);");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ScriptException se) {
se.printStackTrace();
}
}
}
}
public void createSymbolSVG(String svgStr) {
synchronized(this) {
boolean fileCreated = false;
File svgFile = new File("config/4586controller/symbol.svg");
if(!svgFile.exists()) {
try {
fileCreated = svgFile.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
fileCreated = true;
}
try {
if(fileCreated) {
List<String> lines = Arrays.asList(svgStr);
Path svgFilePath = Paths.get(svgFile.getPath());
Files.write(svgFilePath, lines, Charset.forName("UTF-8"));
//Conversion will happen on an individual thread - COMMENTED OUT
convertSVGToJPEG(svgFile);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
public void convertSVGToJPEG(final File svgFile) {
synchronized(this) {
Runnable svgToJPEGConversion = new Runnable() {
public void run() {
try {
// TODO Auto-generated method stub
//NOw convert svg to jpg
String svg_URI_input = svgFile.toURI().toString();
TranscoderInput input_svg_image = new TranscoderInput(svg_URI_input);
//Step-2: Define OutputStream to JPG file and attach to TranscoderOutput
File jpgFile = new File("config/4586controller/uav.jpg");
if(jpgFile.exists()) {
jpgFile.createNewFile();
}
OutputStream jpg_ostream = new FileOutputStream(jpgFile);
TranscoderOutput output_jpg_image = new TranscoderOutput(jpg_ostream);
// Step-3: Create JPEGTranscoder and define hints
JPEGTranscoder my_converter = new JPEGTranscoder();
my_converter.addTranscodingHint(JPEGTranscoder.KEY_QUALITY,new Float(.9));
// Step-4: Write output
my_converter.transcode(input_svg_image, output_jpg_image);
// Step 5- close / flush Output Stream
jpg_ostream.flush();
jpg_ostream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (TranscoderException te) {
te.printStackTrace();
}
}
};
Thread imageConversionThread = new Thread(svgToJPEGConversion);
imageConversionThread.start();
}
}
public int getAltitude() {
return altitude;
}
public int getHeading() {
return heading;
}
public int getSpeed() {
return speed;
}
}
创建公共类符号{
专用静态最终记录器日志=
getLogger(UAVSymbolCreation.class);
国际高度;
int标题;
整数速度;
公共符号创建(整数高度、整数速度、整数航向){
这个高度=高度;
this.heading=标题;
速度=速度;
}
public void createSymbol(){
已同步(此){
文件milSymbolLib=new文件(“config/4586controller/milsymbol.js”);
if(milSymbolLib.exists()){
试一试{
Reader libraryReader=新文件读取器(milSymbolLib);
ScriptEngine ScriptEngine=new ScriptEngineManager().getEngineByName(“JavaScript”);
scriptEngine.eval(libraryReader);
SYMBOL创建SYMBOL创建=此;
scriptEngine.put(“symbolCreation”,symbolCreation);
scriptEngine.eval(“函数运行(symbolCreation){var altitude=symbolCreation.getAltitude();”
+“var speedVal=symbolCreation.getSpeed();”
+“var heading=symbolCreation.getHeading();”
+“symbolCreation.createSymbolSVG(新ms.Symbol('SFA-MFQ------',{尺寸:20,高度:高度,速度:速度,方向:航向})。asSVG();}运行(symbolCreation);”;
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(脚本异常){
se.printStackTrace();
}
}
}
}
public void createSymbolSVG(字符串svgStr){
已同步(此){
布尔fileCreated=false;
File svgFile=新文件(“config/4586controller/symbol.svg”);
如果(!svgFile.exists()){
试一试{
fileCreated=svgFile.createNewFile();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}否则{
fileCreated=true;
}
试一试{
如果(文件已创建){
列表行=Arrays.asList(svgStr);
Path svgFilePath=Path.get(svgFile.getPath());
write(svgFilePath、line、Charset.forName(“UTF-8”);
//转换将在单个线程上进行-已注释掉
convertSVGToJPEG(svgFile);
}
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
}
}
public void convertSVGToJPEG(最终文件svgFile){
已同步(此){
Runnable svgToJPEGConversion=new Runnable(){
公开募捐{
试一试{
//TODO自动生成的方法存根
//现在将svg转换为jpg
字符串svg_URI_input=svgFile.toURI().toString();
TranscodeInput\u svg\u image=新的TranscodeInput(svg\u URI\u输入);
//步骤2:将OutputStream定义为JPG文件并附加到TranscoderOutput
文件jpgFile=新文件(“config/4586controller/uav.jpg”);
if(jpgFile.exists()){
jpgFile.createNewFile();
}
OutputStream jpg_ostream=新文件OutputStream(jpgFile);
转码输出\ jpg\ U图像=新转码输出(jpg\ U ostream);
//步骤3:创建JPEG转码器并定义提示
JPEGTranscoder my_converter=新的JPEGTranscoder();
my_converter.addTranscodingHint(JPEGTranscoder.KEY_质量,新浮点(.9));
//步骤4:写入输出
转换代码(输入svg图像,输出jpg图像);
//步骤5-关闭/刷新输出流
jpg_ostream.flush();
jpg_ostream.close();
}捕获(ioe异常ioe){
ioe.printStackTrace();
}捕获(代码转换){
te.printStackTrace();
}
}
};
线程图像转换线程=新线程(SVGTOJPEGONVERSION);
ImageConversionRead.start();
}
}
public int getAltitude(){
返回高度;
}
public int getHeading(){
返回航向;
}
public int getSpeed(){
返回速度;
}
}
该类使用流读取文件。
您的代码从不调用从