一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JavaFX桌面應用未響應問題解決方案

JavaFX桌面應用未響應問題解決方案

2020-07-31 15:24HiIT青年 Java教程

這篇文章主要介紹了JavaFX桌面應用未響應問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

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

在JavaFX應用中同樣也會出現這種情況,在開發過程中應該盡量避免這種情況的出現。

1. “未響應”重現

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

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

?
1
2
3
4
5
<dependency>
 <groupId>org.jsoup</groupId>
 <artifactId>jsoup</artifactId>
 <version>1.13.1</version>
</dependency>

編譯AppService,實現抓取Google頁面的title信息。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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肯定是超時的,這里設置了超時10秒。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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應用,當點擊第一個Go按鈕之后,再點擊其他按鈕界面就會卡住,出現“未響應”的現象。

JavaFX桌面應用未響應問題解決方案

2. UI線程、業務線程分離

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

改造一下AppUI,將調用visitGoogle的代碼放到新線程去執行。

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

這里直接采用new的方式創建線程,實際應用中最好是使用線程池。

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

JavaFX桌面應用未響應問題解決方案

界面卡住的問題雖然解決了,但又出現了新的問題。

3. 在UI線程更新UI

在UI線程處理業務會導致界面卡住,在業務線程更新UI會出現異常,為了能在業務線程中更新UI,JavaFX為開發者提供了一個Platform類。
只需要在業務線程中,將更新UI的代碼放在這個類的runLater方法中執行即可。

下面再次改造AppUI

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

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

JavaFX桌面應用未響應問題解決方案

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

所以特別注意,在開發過程中應該盡量避免:

在UI線程中處理業務在業務線程中更新UI

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/itqn/p/13388247.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲上最大成网人站4438 | 国产精品久久久久久岛国 | 果冻传媒林予曦图片 | 日产精品卡一卡2卡三卡乱码工厂 | sss在线观看免费视频 | 国产理论片在线观看 | 国产精品亚洲专区在线播放 | 女教师波多野结衣高清在线 | 免费网址视频在线看 | 亚洲第一男人网站 | 日本无卡视频 | 亚洲成av人片在线观看天堂无码 | 免费精品在线 | 污软件在线观看 | 国产福利片在线 | 无人在线视频高清免费观看动漫 | 欧美午夜寂寞影院安卓列表 | caoporm国产精品视频免费 | 国产精品欧美韩国日本久久 | 色婷婷天天综合在线 | 无限资源在线观看8 | 欧美综合另类 | 国产激情在线 | 国产xx肥老妇视频奂费 | 99热这里有精品 | 精品久久99麻豆蜜桃666 | 波多野结衣一区免费作品 | 国产精品成人免费福利 | 久久精品动漫网一区二区 | 色婷婷影院在线视频免费播放 | 精品无码国产污污污免费网站2 | 四虎在线精品观看免费 | 国产午夜精品久久理论片小说 | 欧美国产日产精品免费视频 | 1024人成网色www | 精品福利一区 | 天堂8在线天堂bt | 日本免费三片在线播放 | 天天色天天综合 | 毛片亚洲毛片亚洲毛片 | 成年男女免费视频 |