首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从网站获取图标,显示和更新图标

从网站获取图标,显示和更新图标
EN

Code Review用户
提问于 2015-07-14 20:38:47
回答 2查看 188关注 0票数 9

有一天,我在想如何从网站上获取图标,并在网站上更新图标时让它显示和更新,所以我编写了以下代码:

代码语言:javascript
复制
URL url2 = null;     
boolean updateIcon = true;
try {
    url2 = new URL("https://dl.dropboxusercontent.com/s/70rhm66myw8ay2v/Perception%20Logo.png");
} catch (MalformedURLException ex) {
    updateIcon = false;
    ex.printStackTrace();
}
if (updateIcon) {
    System.out.println("[Perception] Icon updated.");
    if (ComputerCheck.isWindows()) {
        Image bimg = Toolkit.getDefaultToolkit().getImage(url2);
        this.setIconImage(bimg);
    } else if (ComputerCheck.isMac()) {
        Application application = Application.getApplication();
        Image image = Toolkit.getDefaultToolkit().getImage(url2);
        application.setDockIconImage(image);  
    }
}

它的工作效率是100%,但它会使启动时间慢得多。我在想我怎么才能优化这个。

EN

回答 2

Code Review用户

回答已采纳

发布于 2015-07-14 21:33:01

我会对这个代码进行重大的重构。我要做的第一件事是将图像检索移到一个单独的方法中,然后图像放置将变得“更简单”。

将您的代码与以下代码进行比较:

代码语言:javascript
复制
Image image = getRemoteLogo();
if (image != null) {
    // Logo updated
    updateLogo(image);
}

这在很大程度上是在重新想象您正在做的事情,根据您的喜好,您可能会将空检查移到updateLogo中。

这样你就可以隐藏图像并摆脱国际海事组织..。在try-块之前的clunky空初始化:

代码语言:javascript
复制
private Image getRemoteLogo() {
    try {
       URL remoteUrl = new URL(Config.getRemoteLogoUrl());
       return Toolkit.getDefaultToolkit().getImage(remoteUrl);
    } catch (MalformedURLException ex) {
       // this is the point where you can slap the programmer :D
       ex.printStackTrace();
       return null;
    }
}

这整齐地将硬编码的dropbox隐藏在(未进一步指定)配置中,这允许更改徽标位置而不必替换类。

此外,它还清晰地抽象出图像加载,并在错误情况下具有清晰的行为。它还去掉了多余的布尔标志。

updateLogo(Image)是历史记录,您可以执行ComputerCheck并相应地设置图像。

创业放缓是你必须忍受的事情。

哦,我稍微更改了变量名。如果可能的话,将来的维护人员(包括您自己)可能无法确定哪个数字对应于哪个URL :)

票数 10
EN

Code Review用户

发布于 2015-07-15 07:58:11

就我个人而言,我要比前面的答案更进一步。我讨厌空检查,因此将空作为参数和/或返回值传递。我这么做的唯一原因是,如果是在一个性能非常重要的环境中。这里的情况似乎并非如此。所以我的看法是:

代码语言:javascript
复制
public void tryToUpdateLogo(URL remoteUrl)
{
    try{
        updateLogo(remoteURL);
    }
    catch(MalformedURLException, UnknownSystemException ex) {
        ex.printStackTrace();
        // HANDLE ERROR
    }
}
private void updateLogo() throws MalformedURLException
{
    Image logo = getLogoFromURL(URL remoteUrl);
    UpdateLogo(logo);
}
private Image getLogoFromURL(URL remoteURL)
{
    return Toolkit.getDefaultToolkit().getImage(remoteUrl);
}
private void updateLogo(Image logo) throws UnknownSystemException
{
    System.out.println("[Perception] Icon updated.");

    if(ComputerCheck.isWindows())
        this.setIconImage(logo);
    else if(ComputerCheck.isMac())
        getMACApplication().setDockIconImage(logo);
    else
        throw new UnknownSystemException();
}

此代码基于“错误处理是一种响应性”的前提,这是由于SRP (单响应性原则)应该与代码分离,如RobertC.Martins 清洁代码中所描述的那样。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/96951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档