掃描二維碼關注

首頁 APP開(kāi)發小(xiǎo)程序開(kāi)發 微信公衆号 網站建設 營銷推廣 經典案列 産品服務 關于我們

“學習(xí)不僅是掌握知識”

向書(shū)本學習(xí),還要向實踐學習(xí)、向生活學習(xí)。消化已有(yǒu)知識,
而且要力求有(yǒu)所發現、有(yǒu)所發明(míng)、有(yǒu)所創造

Java性能(néng)優化技巧集錦(三)

2019/3/21 19:18:21

Java性能(néng)優化技巧集錦(三)

三、GUI篇

  這一部分(fēn)介紹的(de)内容适合于圖形用(yòng)戶界面的(de)應用(yòng)(Applet和(hé)普通應用(yòng)),要用(yòng)到(dào)AWT或Swing。

  3.1 用(yòng)JAR壓縮類文(wén)件(jiàn)

  Java檔案文(wén)件(jiàn)(JAR文(wén)件(jiàn))是根據JavaBean标準壓縮的(de)文(wén)件(jiàn),是發布JavaBean組件(jiàn)的(de)主要方式和(hé)推薦方式。JAR檔案有(yǒu)助于減少(shǎo)文(wén)件(jiàn)體積,縮短下載時間。例如(rú),它有(yǒu)助于Applet提高(gāo)啓動速度。一個(gè)JAR文(wén)件(jiàn)可(kě)以包含一個(gè)或者多個(gè)相(xiàng)關的(de)Bean以及支持文(wén)件(jiàn),比如(rú)圖形、聲音(yīn)、HTML 和(hé)其他(tā)資源。

  要在HTML/JSP文(wén)件(jiàn)中指定JAR文(wén)件(jiàn),隻需在Applet标記中加入ARCHIVE = "name.jar"聲明(míng)。


  3.2 提示Applet裝入進程

  你(nǐ)是否看到(dào)過使用(yòng)Applet的(de)網站,注意到(dào)在應該運行(xíng)Applet的(de)地(dì)方出現了一個(gè)占位符?當Applet的(de)下載時間較長時,會(huì)發生什(shén)麽事情?最大(dà)的(de)可(kě)能(néng)就是用(yòng)戶掉頭離(lí)去。在這種情況下,顯示一個(gè)Applet正在下載的(de)信息無疑有(yǒu)助于鼓勵用(yòng)戶繼續等待。

  下面我們來看看一種具體的(de)實現方法。首先創建一個(gè)很小(xiǎo)的(de)Applet,該Applet負責在後台下載正式的(de)Applet:

import java.applet.Applet;
import java.applet.AppletStub;
import java.awt.Label;
import java.awt.Graphics;
import java.awt.GridLayout;
public class PreLoader extends Applet implements Runnable, AppletStub {
String largeAppletName;
Label label;
public void init() {
// 要求裝載的(de)正式Applet
largeAppletName = getParameter("applet");
// “請稍等”提示信息
label = new Label("請稍等..." + largeAppletName);
add(label);
}
public void run(){
try {
// 獲得待裝載Applet的(de)類
Class largeAppletClass = Class.forName(largeAppletName);
// 創建待裝載Applet的(de)實例
Applet largeApplet = (Applet)largeAppletClass.newInstance();
// 設置該Applet的(de)Stub程序
largeApplet.setStub(this);
// 取消“請稍等”信息
remove(label);
// 設置布局
setLayout(new GridLayout(1, 0));
add(largeApplet);
// 顯示正式的(de)Applet
largeApplet.init();
largeApplet.start();
}
catch (Exception ex) {
// 顯示錯誤信息
label.setText("不能(néng)裝入指定的(de)Applet");
}
// 刷新屏幕
validate();
}
public void appletResize(int width, int height) {
// 把appletResize調用(yòng)從stub程序傳遞到(dào)Applet
resize(width, height);
}
}

  編譯後的(de)代碼小(xiǎo)于2K,下載速度很快。代碼中有(yǒu)幾個(gè)地(dì)方值得注意。首先,PreLoader實現了AppletStub接口。一般地(dì),Applet從調用(yòng)者判斷自己的(de)codebase。在本例中,我們必須調用(yòng)setStub()告訴Applet到(dào)哪裏提取這個(gè)信息。另一個(gè)值得注意的(de)地(dì)方是, AppletStub接口包含許多和(hé)Applet類一樣的(de)方法,但(dàn)appletResize()方法除外。這裏我們把對appletResize()方法的(de)調用(yòng)傳遞給了resize()方法。


3.3 在畫出圖形之前預先裝入它
  ImageObserver接口可(kě)用(yòng)來接收圖形裝入的(de)提示信息。ImageObserver接口隻有(yǒu)一個(gè)方法imageUpdate(),能(néng)夠用(yòng)一次repaint()操作在屏幕上(shàng)畫出圖形。下面提供了一個(gè)例子。

public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) {
if ((flags & ALLBITS) !=0 {
repaint();
}
else if (flags & (ERROR |ABORT )) != 0) {
error = true;
// 文(wén)件(jiàn)沒有(yǒu)找到(dào),考慮顯示一個(gè)占位符
repaint();
}
return (flags & (ALLBITS | ERROR| ABORT)) == 0;
}

  當圖形信息可(kě)用(yòng)時,imageUpdate()方法被調用(yòng)。如(rú)果需要進一步更新,該方法返回true;如(rú)果所需信息已經得到(dào),該方法返回false。

  3.4 覆蓋update方法

  update()方法的(de)默認動作是清除屏幕,然後調用(yòng)paint()方法。如(rú)果使用(yòng)默認的(de)update()方法,頻繁使用(yòng)圖形的(de)應用(yòng)可(kě)能(néng)出現顯示閃爍現象。要避免在paint()調用(yòng)之前的(de)屏幕清除操作,隻需按照(zhào)如(rú)下方式覆蓋update()方法:

public void update(Graphics g) {
paint(g);
}

  更理(lǐ)想的(de)方案是:覆蓋update(),隻重畫屏幕上(shàng)發生變化的(de)區域,如(rú)下所示:

public void update(Graphics g) {
g.clipRect(x, y, w, h);
paint(g);
}

3.5 延遲重畫操作

  對于圖形用(yòng)戶界面的(de)應用(yòng)來說,性能(néng)低下的(de)主要原因往往可(kě)以歸結爲重畫屏幕的(de)效率低下。當用(yòng)戶改變窗


深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04

咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967

更多可(kě)以了解的(de)信息

客戶案列
新聞資訊
資質榮譽
團隊風采
項目進度查詢

售前QQ咨詢
QQ溝通 項目QQ溝通

精銳軟件(jiàn)

Copyright© 2018-2023 深圳市無窮大軟件技術有限公司 All Rights Reserved. 京ICP證000000号 公安備案号:粵公網安備44030502009460号