Apache Pivot教程 -- BackgroundThread(ThreadSafe)异步

    科技2024-03-25  11

    Apache Pivot教程 – Background Thread(Thread Safe)异步

    在之前的文章中讲过Background Thread,但是可以发现,虽然线程安全了,但是如果长时间一直执行,就还是会像没有用Task时一样 Apache Pivot想到了这个问题,并在jar包中解决了这个问题,只需要使用TaskAdapter和TaskListener就可以解决问题了,达到一部执行Background Task 今天就来讲一讲TaskAdapter和TaskListener 它们一个是用来适应进程的,另一个是用来监听进程的

    new Task<String>() { @Override public void execute() { } }.execute(new TaskAdapter<String>(new TaskListener<String>(){ @Override public void executeFailed(Task<String> task) { } @Override public void taskExecuted(Task<String> task) { } }));

    大家可以注意到,这一段代码没有用到try catch,因为TaskAdapter已经帮我们完成了错误处理

    package background_thread; import org.apache.pivot.wtk.*; import org.apache.pivot.wtk.ScrollPane.ScrollBarPolicy; import org.apache.pivot.collections.*; import org.apache.pivot.util.concurrent.*; class ThreadSafeA extends Task<String> { public ThreadSafeA() { } @Override public String execute() throws TaskExecutionException { int doing=0; while(doing<10) { System.out.println("hello"); try { Thread.sleep(1000); } catch(InterruptedException err) { } doing+=1; } while(doing<300) { System.out.println("hello"); doing++; } return ""; } } public class thread_safe_A implements Application { private Window window=null; public static void main(String [] args) { try { DesktopApplicationContext.main(thread_safe_A.class, args); } catch(Throwable err) { } } @Override public void startup(Display display, Map<String, String>properties) { window=new Window(); ScrollPane s=new ScrollPane(); s.setVerticalScrollBarPolicy(ScrollBarPolicy.AUTO); BoxPane panel=new BoxPane(); s.setView(panel); ActivityIndicator activityindicator=new ActivityIndicator(); activityindicator.setActive(true); panel.add(activityindicator); window.setContent(s); window.setTitle("Thread safe"); window.setMaximized(true); window.open(display); ThreadSafeA t=new ThreadSafeA(); t.execute(new TaskAdapter<String>(new TaskListener<String>() { @Override public void executeFailed(Task<String> arg0) { } @Override public void taskExecuted(Task<String> arg0) { activityindicator.setActive(false); } })); } @Override public boolean shutdown(boolean optional) { if(window!=null) { window.close(); } return false; } @Override public void suspend() { } @Override public void resume() { } }

    这回可以成功执行任务,不会出问题了


    看到最后才有惊喜和知识 大家注意了 这一段很重要

    用了TaskAdapter和TaskListener后 虽然不用写try catch了 而且可以在后台同步运行,不影响前台 但是 Task将不能操作前端界面 不可以添加控件 不可以删除控件 不可以更改控件属性 虽然不会报错 用为TaskAdapter已经把错误处理掉了 但是 一旦操作前端界面 整个进程就会停止运行 目前作者还没有找到解决的方法 因为Apache Pivot没有在它的文档中写怎么解决 就算翻遍源码也没有用 所以 请大家好好考虑 到底是用同步还是异步 免得出错

    关于ActivityIndicator这个动画很好的加载显示器,下一章会详细讲到

    Processed: 0.022, SQL: 9