一、坑场景复现

源于w3cschool的JavaFX WebEngine测试例子,运行代码都没有输出,一直在研究为什么会出现这样的结果。

在测试过程中使用WebEngine的html加载,使用WebEngine的url加载,使用WebView加载url,使用仅Scene装载WebView(没有加入Stage或者没有运行stage.show()方法),还有使用Scene装载WebView(加入Stage并且运行stage.show()方法)等等,其中只有WebEngine的html加载、Scene装载WebView(加入Stage并且运行stage.show()方法)有输出文档信息,其余都没有输出结果。

(1)代码对比

1、WebEngine 加载html

import com.sun.javafx.application.PlatformImpl;
import javafx.concurrent.Worker;
import javafx.scene.web.WebEngine;public class A {public static void main(String[] args) throws InterruptedException {PlatformImpl.startup(()->{doDom();System.err.println("finish");});}public static void doDom() {WebEngine webEngine = new WebEngine();webEngine.getLoadWorker().stateProperty().addListener((obs, oldValue, newValue) -> {if (newValue == Worker.State.SUCCEEDED) {String html = (String) webEngine.executeScript("document.documentElement.outerHTML");System.out.println(html);System.exit(0);}System.out.println(newValue + " ");}); // addListener()String s="<html>\n" +"\n" +"<head>\n" +"<title>我的第一个 HTML 页面</title>\n" +"</head>\n" +"\n" +"<body>\n" +"<p>body 元素的内容会显示在浏览器中。</p>\n" +"<p id='a'>title 元素的内容会显示在浏览器的标题栏中。</p>\n" +"</body>\n" +"<script>var a =document.getElementById('a');\n" +"a.style.color='red';</script>\n" +"</html>\n";webEngine.loadContent(s);}
}

2、WebEngine 加载url

import com.sun.javafx.application.PlatformImpl;
import javafx.concurrent.Worker.State;
import javafx.scene.web.WebEngine;public class Test {public static void main(String[] args) throws InterruptedException {PlatformImpl.startup(() -> {doDom();System.err.println("finish");});}public static void doDom(){WebEngine webEngine = new WebEngine();webEngine.getLoadWorker().stateProperty().addListener((obs, oldValue, newValue) -> {if (newValue == State.SUCCEEDED) {String html = (String) webEngine.executeScript("document.documentElement.outerHTML");System.out.println(html);System.exit(0);}System.out.println(newValue + " ");}); // addListener()webEngine.load("https://www.w3cschool.cn/java/javafx-webengine.html");}
}

(2)输出结果

1、WebEngine 加载html:

SCHEDULED
RUNNING
finish
<html><head>
<title>我的第一个 HTML 页面</title>
</head><body>
<p>body 元素的内容会显示在浏览器中。</p>
<p id="a" style="color: red;">title 元素的内容会显示在浏览器的标题栏中。</p><script>var a =document.getElementById('a');
a.style.color='red';</script></body></html>Process finished with exit code 0

2、WebEngine 加载url:

SCHEDULED
RUNNING
finish

程序运行不能结束。

如果在WebEngin类的dispatchLoadEvent(long frame, int state, String url, String contentType, double workDone, int errorCode)方法里面debug运行,则输出

SCHEDULED
RUNNING
finish
<html>
...//内容太多此处省略
</html>Process finished with exit code 0

二、分析原因

通过run和debug模式的运行的结果不同,让我意识到WebEngine 变量是局部变量,里面的监听事件还没有执行完就被gc回收。

备注:Stage primaryStage是局部变量,没有调用show方法,很快就被gc回收,里面包含的WebEngine、WebView和Scene也会被gc回收,故看不到输出。

以前还有遇见过这样的现象,比如Javafx的MediaPlayer播放几秒钟音乐就停止了,因为这个有播放声音比较明显,可以找到是gc回收了MediaPlayer。

import com.sun.javafx.application.PlatformImpl;
import javafx.concurrent.Worker.State;
import javafx.scene.web.WebEngine;public class Test {public static void main(String[] args) throws InterruptedException {PlatformImpl.startup(() -> {doDom();System.out.println("finish");});}static WebEngine webEngine;//webEngine必须要有引用在使用,不能定义成局部变量,否则被gc回收就没有输出结果public static void doDom(){//WebEngine webEngine = new WebEngine();//以前定义成局部变量,被gc回收了webEngine = new WebEngine();webEngine.getLoadWorker().stateProperty().addListener((obs, oldValue, newValue) -> {if (newValue == State.SUCCEEDED) {String html = (String) webEngine.executeScript("document.documentElement.outerHTML");System.out.println(html);System.exit(0);}System.out.println(newValue + " ");}); // addListener()webEngine.load("https://www.w3cschool.cn/java/javafx-webengine.html");//webEngine.loadContent(html);//直接加载html}
}

Javafx的WebEngine的url加载不输出结果坑,gc回收了局部变量相关推荐

  1. URL加载系统之三:NSURLConnection

    NSURLConnection提供了简单的接口来创建和取消一个连接,并支持一个代理方法的集合来提供连接的响应,并对连接进行多方面的控制.这个类的方法可以分为5大类:URL加载.缓存管理.认证与证书.c ...

  2. Django实现media、static静态资源通过url加载访问

    Django实现media.static静态资源通过url加载访问 Django项目中一般上传的静态文件会存储在根目录的media文件夹下,template模板使用的静态css.js.image等文件 ...

  3. moviepy音视频剪辑:音视频的加载和输出

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 在本地进行音视频处理时,首先要从视频文件 ...

  4. moviepy音视频剪辑:使用VideoFileClip、AudioFileClip和write_videofile、write_audiofile进行音视频的加载和输出

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 在本地进行音视频处理时,首先要从视频文件 ...

  5. android访问重定向地址,如何从android中重定向url加载图像(示例代码)

    嗨,我正面临这个问题 我从RESTCall获取了一个URL 网址是http://hck.re/kWWxUI 但是当我在浏览器中检查时,它会重定向到https://s3-ap-southeast-1.a ...

  6. Jsoup根据URL加载一个Document

    有时候我们可能希望通过一个url地址,然后提取里面的内容,转换成document对象. 用 Jsoup.connect(String url)方法: Document doc = Jsoup.conn ...

  7. 开发必备知识点--django项目启动时,url加载之前,执行某个.py文件

    django项目启动时,自定义执行某个py文件 在任意的app下的apps.py中的Config类下自定义ready()方法,并且调用autodiscover_modules. app01/apps. ...

  8. 根据图片URL加载图片到缓存

    public BufferedImage loadImgByUrl( String imgUrl){//创建httpClient客户端CloseableHttpClient httpClient=Ht ...

  9. flutter/Android接入友盟、阿里百川SDK,打包APK后报无法加载arr库的坑

    刚接触flutter,边学边做.其实遇到的是两个坑,但看起来像是同个问题引起的,多么痛的领悟,基础不牢.解决问题流程不对太耽误时间了. 打包APK后报无法加载友盟arr库 有篇帖子说是启用压缩导致的, ...

最新文章

  1. 新闻更新php html,phphtml 新闻发布系统,运用php+mysql,里面包括数据库和php文件。 Other systems 其他 249万源代码下载- www.pudn.com...
  2. 【MPI高性能计算】用集合通信改进梯形求和积分
  3. 引入spring-boot-starter-actuator,控制台没有mapper的映射信息打印问题
  4. 国外计算机科学英语演讲,2014年暨大英语演讲大赛圆满落幕
  5. python观察日志(part14)--计数器Count
  6. lumion自动保存_Lumion所有快捷键,值得收藏
  7. 两边双虚线是什么意思_锯齿车道、倒三角标志什么意思?以下5种交通标线你认识几个?...
  8. 打造最舒适的webview调试环境 1
  9. .NET配置文件解析过程详解【转载】
  10. 远程接入--为什么选择异速联
  11. Teaching Machines to Read and Comprehend翻译
  12. 物联网毕设(智能灌溉系统 -- Android端)
  13. [C语言]成绩与平均分问题:编写函数ReadScore()和Average(),输入某班学生某门课的成绩(最多不超过40人),当输入为负值时,表示输入结束,用函数编程统计成绩高于平均分的学生人数。
  14. 函数原型中int *arr和int arr[]
  15. IDE+vim,提高开发效率
  16. 练手小项目(1)——智能聊天机器人
  17. idea开启远程调试
  18. 2011年的工作总结
  19. Android 基于AccessibilityService智能安装Apk 仿 豌豆荚
  20. 如何在本地进行微信公众号的开发和调试

热门文章

  1. 鼠标右键 移动选定的文件夹到指定位置_iRightMouse:一款免费Mac鼠标右键增强神器...
  2. java中编译类型的方法 和 运行时的类型方法 有什么区别
  3. 字符串匹配经典题目——KMP算法(Leetcode题解-Python语言)
  4. java numberformat异常_Java NumberFormat格式化float类型的bug
  5. [SpringSecurity]web权限方案_CSRF功能
  6. 高等数学上-赵立军-北京大学出版社-题解-练习6.1
  7. 高等数学上-赵立军-北京大学出版社-题解-练习2.4
  8. 蓝桥杯2017初赛-打印大X-找规律
  9. Silver Cow Party POJ - 3268(dijkstra+反向交换)
  10. 深圳本次核酸检普筛怎么将个人信息和结果对应上??