最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaFX桌面應(yīng)用未響應(yīng)問題解決方案

 更新時間:2020年07月31日 11:59:11   作者:HiIT青年  
這篇文章主要介紹了JavaFX桌面應(yīng)用未響應(yīng)問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

日常使用軟件的過程中,偶爾會遇到軟件突然卡住,再點擊幾次就變成“未響應(yīng)”的情況。

在JavaFX應(yīng)用中同樣也會出現(xiàn)這種情況,在開發(fā)過程中應(yīng)該盡量避免這種情況的出現(xiàn)。

1. “未響應(yīng)”重現(xiàn)

應(yīng)用程序出現(xiàn)“未響應(yīng)”這種情況往往是因為在UI線程中處理一些耗時的業(yè)務(wù),當UI線程在處理耗時的業(yè)務(wù)時,UI就會卡住。
下面通過一個示例(獲取Google頁面title信息)來演示一下“未響應(yīng)”這種情況。

這里使用 jsoup 來抓取Google頁面的title信息,需要引入jsoup的maven依賴:

<dependency>
 <groupId>org.jsoup</groupId>
 <artifactId>jsoup</artifactId>
 <version>1.13.1</version>
</dependency>

編譯AppService,實現(xiàn)抓取Google頁面的title信息。

public class AppService {
  public static final AppService INSTANCE = new AppService();
  private AppService() {
  }
  public String visitGoogle() {
    try {
      Document document = Jsoup.parse(new URL("https://www.google.com"), 10_000);
      return document.head().getElementsByTag("title").get(0).text();
    } catch (Exception e) {
      return e.getMessage();
    }
  }
}

因為沒有F墻,這里訪問Google肯定是超時的,這里設(shè)置了超時10秒。

接著改造AppUI,當點擊Go按鈕的時候,調(diào)用visitGoogle并將結(jié)果顯示在界面上。

public class AppUI implements Initializable {
  public Label text;
  private AppService appService = AppService.INSTANCE;
  private AppModel model = new AppModel();
  @Override
  public void initialize(URL location, ResourceBundle resources) {
    text.textProperty().bindBidirectional(model.textProperty());
    model.setText("Hello JavaFX.");
  }
  public void click(ActionEvent event) {
    model.setText(appService.visitGoogle());
  }
}

運行JavaFX應(yīng)用,當點擊第一個Go按鈕之后,再點擊其他按鈕界面就會卡住,出現(xiàn)“未響應(yīng)”的現(xiàn)象。

2. UI線程、業(yè)務(wù)線程分離

前面有提到,出現(xiàn)“未響應(yīng)”這種情況是因為在UI線程中處理一些耗時的業(yè)務(wù),當UI線程在處理耗時的業(yè)務(wù)時,UI就會卡住。
所以如果能將UI線程和業(yè)務(wù)線程分開來,這樣就能解決界面卡住的問題了。

改造一下AppUI,將調(diào)用visitGoogle的代碼放到新線程去執(zhí)行。

public void click(ActionEvent event) {
  new Thread(() -> model.setText(appService.visitGoogle())).start();
}

這里直接采用new的方式創(chuàng)建線程,實際應(yīng)用中最好是使用線程池。

雖然將業(yè)務(wù)代碼放在新線程中處理解決了界面卡住的問題,但是上面的代碼中,通過model.setText()來改變標簽(Label)的文字。
實際上會發(fā)現(xiàn)程序運行后會出現(xiàn)異常,一旦我們在非UI線程中嘗試改變UI效果,程序就會拋出下面的異常。

界面卡住的問題雖然解決了,但又出現(xiàn)了新的問題。

3. 在UI線程更新UI

在UI線程處理業(yè)務(wù)會導(dǎo)致界面卡住,在業(yè)務(wù)線程更新UI會出現(xiàn)異常,為了能在業(yè)務(wù)線程中更新UI,JavaFX為開發(fā)者提供了一個Platform類。
只需要在業(yè)務(wù)線程中,將更新UI的代碼放在這個類的runLater方法中執(zhí)行即可。

下面再次改造AppUI

public void click(ActionEvent event) {
  new Thread(() -> {
    String title = appService.visitGoogle();
    Platform.runLater(() -> model.setText(title));
  }).start();
}

這里還是將業(yè)務(wù)代碼放在新線程中執(zhí)行,但是涉及UI更新的代碼model.setText()則放在Platform.runLater()里面執(zhí)行。
這樣,就解決了界面卡住以及非UI線程更新UI出現(xiàn)異常的問題了。

通過改造,雖然請求Google超時了,但是UI并沒有卡住,同時界面也得到了更新。

所以特別注意,在開發(fā)過程中應(yīng)該盡量避免:

在UI線程中處理業(yè)務(wù)在業(yè)務(wù)線程中更新UI

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一篇文章帶你搞定JAVA Maven

    一篇文章帶你搞定JAVA Maven

    Maven是每個Java程序都會遇到的包管理工具,今天整理一下Maven的相關(guān)知識,從青銅到王者,一文全了解,我們開始吧,希望對你有所幫助
    2021-07-07
  • Spring MVC學習教程之RequestMappingHandlerMapping匹配

    Spring MVC學習教程之RequestMappingHandlerMapping匹配

    這篇文章主要給大家介紹了關(guān)于Spring MVC學習教程之RequestMappingHandlerMapping匹配的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-11-11
  • SpringBoot?實現(xiàn)流控的操作方法

    SpringBoot?實現(xiàn)流控的操作方法

    本文介紹了限流算法的基本概念和常見的限流算法,包括計數(shù)器算法、漏桶算法和令牌桶算法,還介紹了如何在Spring?Boot中使用Guava庫和自定義注解以及AOP實現(xiàn)接口限流功能,感興趣的朋友一起看看吧
    2024-12-12
  • Intellij Idea修改代碼方法參數(shù)自動提示快捷鍵的操作

    Intellij Idea修改代碼方法參數(shù)自動提示快捷鍵的操作

    這篇文章主要介紹了Intellij Idea修改代碼方法參數(shù)自動提示快捷鍵的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 深入了解Maven Settings.xml文件的結(jié)構(gòu)和功能

    深入了解Maven Settings.xml文件的結(jié)構(gòu)和功能

    這篇文章主要為大家介紹了Maven Settings.xml文件基本結(jié)構(gòu)和功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • IDEA的maven設(shè)置代理方式

    IDEA的maven設(shè)置代理方式

    文章介紹了如何設(shè)置IntelliJ?IDEA系統(tǒng)代理,并在Maven的Importing和Runner中添加代理配置,包括設(shè)置代理主機和端口
    2025-01-01
  • linux配置java環(huán)境變量詳細過程

    linux配置java環(huán)境變量詳細過程

    這篇文章主要介紹了linux配置java環(huán)境變量詳細過程,需要的朋友可以參考下
    2015-09-09
  • Java中hashMap遍歷的9種方式

    Java中hashMap遍歷的9種方式

    hashMap是非常重要的容器類,本文主要介紹了Java中hashMap遍歷的9種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • Springboot初始化啟動報錯Error?creating?bean?with?name?'dataSource'?defined?in?class?path?resource

    Springboot初始化啟動報錯Error?creating?bean?with?name?'da

    這篇文章主要為大家介紹了Springboot初始化啟動報Error?creating?bean?with?name?'dataSource'?defined?in?class?path?resource解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Java裝飾者模式的示例詳解

    Java裝飾者模式的示例詳解

    裝飾者模式:在不改變原有對象的基礎(chǔ)之上,動態(tài)的將功能附加到對象上,提供了繼承更有彈性的替代方案,也體現(xiàn)了開閉原則。本文將通過示例詳細講解一下裝飾者模式,需要的可以參考一下
    2022-02-02

最新評論

珲春市| 南开区| 九江市| 隆化县| 大悟县| 西安市| 读书| 房产| 保康县| 抚远县| 斗六市| 嘉义市| 宜君县| 宝应县| 类乌齐县| 苏尼特右旗| 杨浦区| 垦利县| 宜黄县| 三河市| 衡东县| 宝兴县| 沙湾县| 侯马市| 青岛市| 吉首市| 威信县| 漳州市| 大悟县| 新泰市| 瓦房店市| 增城市| 林芝县| 兴宁市| 万安县| 门源| 巩义市| 石首市| 舞阳县| 庐江县| 乡宁县|