欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

應(yīng)用程序出現(xiàn)“未響應(yīng)”這種情況往往是因?yàn)樵赨I線(xiàn)程中處理一些耗時(shí)的業(yè)務(wù),當(dāng)UI線(xiàn)程在處理耗時(shí)的業(yè)務(wù)時(shí),UI就會(huì)卡住。
下面通過(guò)一個(gè)示例(獲取Google頁(yè)面title信息)來(lái)演示一下“未響應(yīng)”這種情況。

這里使用 jsoup 來(lái)抓取Google頁(yè)面的title信息,需要引入jsoup的maven依賴(lài):

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

編譯AppService,實(shí)現(xiàn)抓取Google頁(yè)面的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();
    }
  }
}

因?yàn)闆](méi)有F墻,這里訪(fǎng)問(wèn)Google肯定是超時(shí)的,這里設(shè)置了超時(shí)10秒。

接著改造AppUI,當(dāng)點(diǎn)擊Go按鈕的時(shí)候,調(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());
  }
}

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

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

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

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

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

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

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

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

3. 在UI線(xiàn)程更新UI

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

下面再次改造AppUI

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

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

通過(guò)改造,雖然請(qǐng)求Google超時(shí)了,但是UI并沒(méi)有卡住,同時(shí)界面也得到了更新。

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java關(guān)于重排鏈表詳細(xì)解析

    Java關(guān)于重排鏈表詳細(xì)解析

    在我們平時(shí)的代碼過(guò)程中,鏈表是我們經(jīng)常遇到的一個(gè)數(shù)據(jù)結(jié)構(gòu),面試題中鏈表占很大一部分,可見(jiàn)鏈表操作是非常重要的。本篇文章我們來(lái)探究一下如何進(jìn)行重排鏈表
    2022-01-01
  • java8 stream自定義分組求和并排序的實(shí)現(xiàn)

    java8 stream自定義分組求和并排序的實(shí)現(xiàn)

    這篇文章主要介紹了java8 stream自定義分組求和并排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java使用新浪微博API通過(guò)賬號(hào)密碼方式登陸微博的實(shí)例

    Java使用新浪微博API通過(guò)賬號(hào)密碼方式登陸微博的實(shí)例

    這篇文章主要介紹了Java使用新浪微博API通過(guò)賬號(hào)密碼方式登陸微博的實(shí)例,一般來(lái)說(shuō)第三方App都是采用OAuth授權(quán)認(rèn)證然后跳轉(zhuǎn)之類(lèi)的方法,而本文所介紹的賬號(hào)方式則更具有自由度,需要的朋友可以參考下
    2016-02-02
  • java設(shè)計(jì)模式責(zé)任鏈模式原理案例詳解

    java設(shè)計(jì)模式責(zé)任鏈模式原理案例詳解

    一個(gè)事件需要經(jīng)過(guò)多個(gè)對(duì)象處理是一個(gè)挺常見(jiàn)的場(chǎng)景,譬如采購(gòu)審批流程,請(qǐng)假流程,軟件開(kāi)發(fā)中的異常處理流程,web請(qǐng)求處理流程等各種各樣的流程,可以考慮使用責(zé)任鏈模式來(lái)實(shí)現(xiàn)
    2021-09-09
  • Java?CountDownLatch線(xiàn)程同步源碼硬核解析

    Java?CountDownLatch線(xiàn)程同步源碼硬核解析

    對(duì)于并發(fā)執(zhí)行,Java中的CountDownLatch是一個(gè)重要的類(lèi)。為了更好的理解CountDownLatch這個(gè)類(lèi),本文將通過(guò)例子和源碼帶領(lǐng)大家深入解析這個(gè)類(lèi)的原理,感興趣的可以學(xué)習(xí)一下
    2023-01-01
  • SpringBoot+Jersey跨域文件上傳的實(shí)現(xiàn)示例

    SpringBoot+Jersey跨域文件上傳的實(shí)現(xiàn)示例

    在SpringBoot開(kāi)發(fā)后端服務(wù)時(shí),我們一般是提供接口給前端使用,本文主要介紹了SpringBoot+Jersey跨域文件上傳的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • Hutool開(kāi)發(fā)利器MapProxy類(lèi)使用技巧詳解

    Hutool開(kāi)發(fā)利器MapProxy類(lèi)使用技巧詳解

    這篇文章主要為大家介紹了Hutool開(kāi)發(fā)利器MapProxy類(lèi)使用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • java如何獲取request中json數(shù)據(jù)

    java如何獲取request中json數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于java如何獲取request中json數(shù)據(jù)的相關(guān)資料,文中通過(guò)代碼示例以及圖文將獲取的方法介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • java實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲

    java實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目

    基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目

    這篇文章主要介紹了基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04

最新評(píng)論