异步处理耗时操作原创
17人赞赏了该文章
2,808次浏览
编辑于2021年03月09日 17:40:03
创作不易,如果文章对您有帮助,请为我点击一个朴实无华的赞^_^,我会更有动力地更新文章。
案例场景:
在开发的过程中,难免会遇到 数据库的查询和存储、磁盘文件操作、网络请求等等耗时的操作,这时需要把这些操作进行一个异步的处理。
思路:
1.按钮点击时,注册异步回调,在异步回调中处理耗时操作。
2.按钮点击时,锁定按钮,防止多次点击;耗时操作处理完成之后,解锁按钮。
设计器:
添加一个按钮
插件代码:
package kd.ecos.demo; import kd.bos.context.RequestContext; import kd.bos.form.control.Button; import kd.bos.form.control.Control; import kd.bos.form.events.ClientCallBackEvent; import kd.bos.form.plugin.AbstractFormPlugin; import java.util.EventObject; public class DemoTestControlPlugin extends AbstractFormPlugin { // 按钮点击时,异步的action private static final String ACTION_CLICK = "wrx1_buttonap_click"; // 按钮的标识 private static final String KEY_BUTTON = "wrx1_buttonap"; @Override public void registerListener(EventObject e) { super.registerListener(e); Button button = getControl(KEY_BUTTON); button.addClickListener(this); } @Override public void click(EventObject evt) { super.click(evt); Control source = (Control)evt.getSource(); if (source.getKey().equals(KEY_BUTTON)) { // 点击按钮时,立刻锁定按钮 getView().setEnable(false, KEY_BUTTON); // 在异步处理 this.getView().addClientCallBack(ACTION_CLICK, 0); } } @Override public void clientCallBack(ClientCallBackEvent e) { if(ACTION_CLICK.equals(e.getName())) { try { // 模拟耗时操作,2秒 // 耗时操作可以是 数据库的查询和存储,网络请求等等具体的业务逻辑,这里用Thread.sleep来代替 Thread.sleep(2000); } catch (Exception exception) { } // 打印操作日志 System.out.println( RequestContext.get().getUserName() + ",操作成功"); // 耗时操作完成,重新开启按钮 getView().setEnable(true, KEY_BUTTON); } } }
效果:
点击按钮之后,插件锁定,执行异步操作
异步操作结束之后,输出日志,按钮解锁
赞 17
17人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读