性能低下是最容易被误解的地方,人们抱怨它有一种呆滞感,但是当用户抱怨性能时,它通常与此无关,而是更平凡的事情……当用户抱怨性能时,它常常是无限的。旋转轮覆盖了整个UI(代号One中的InfiniteProgress对话框),这使它们像傻瓜一样站着等待着他们的电话让他们再次触摸它!
这很烦人,令人沮丧,我可以举出很多本机应用程序来对常规数据执行此操作!
当我们添加InfiniteProgress对话框时,该对话框仅适用于真正的阻止操作,例如登录。 但是,回头看,我可以看到我们在演示中也滥用了此功能,这可能激发了一些开发人员这样做。
本机应用程序具有的优势之一是可以缓存所有内容,我们始终可以显示本地缓存的数据并在后台进行提取。 我们可以指示数据以某种方式是过时的,或者在处理实时数据时没有连接,但是在可能的情况下我们不应该阻止用户。 您可以做一些琐碎的事情来指示进度,例如:
final Button performServerOp = new Button("Send Details");
performServerOp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
performServerOp.getParent().replace(performServerOp, new InfiniteScroll(), null);
// async server call
}
});
这自然是微不足道的,但是我们可以通过在本地缓存数据并编写在联机/脱机运行时无缝运行的代码来做进一步的工作。 诸如URLImage和ImageDownloadService之类的类可以变得非常方便,因为它们可以无缝处理此类情况。
您可以在组件顶部显示“陈旧”指示符,以表明您处于脱机模式或该组件包含尚未与服务器同步的更改,我们有时要做的一个技巧是将InfiniteScroll放置在组件顶部。指示它正在同步的组件。 重要的是不要过度执行此操作,因为InfiniteScroll会触发重新绘制,这将减慢应用程序的响应速度! 例如:
Container parent = new Container(new LayeredLayout());
FlowLayout fl = new FlowLayout(Component.RIGHT)l
Container infiniteContainer = new Container(fl);
infiniteContainer.addComponent(new InfiniteProgress());
parent.addComponent(componentThatsUpdating);
parent.addComponent(infiniteContainer);
即使您的应用程序受服务器限制,您也可以显示上次服务器连接中的最后一个UI表单。 这很关键,因为通常用户会检查他的设备以查看最后打开的东西,并且如果自上次运行以来该应用程序已挂起,他就不想重新开始更深入地研究设备的过程。
这不是一个新概念,尽管与同类产品相比,Palm Pilot的硬件性能相对较弱,但由于其出色的性能而非常成功。 Palm要求软件像硬件一样工作,当您按下物理按钮时,您希望即时获得满足,并且他们希望应用程序以相同的方式运行(公认的是,当时的应用程序通常不进行网络连接)。
翻译自: https://www.javacodegeeks.com/2014/11/dont-block-the-ui.html