SwingWorker的process方法中chunks.size()-1始终为0问题排查
问题分析与修复
你犯的核心错误是搞混了process方法里chunks列表的索引和元素值:
publish(counter)并不会每次调用都立刻触发process,SwingWorker会把多次发布的值攒成一个列表(也就是chunks)再一次性交给process处理- 你写的
chunks.size() - 1是在拿这个列表最后一个元素的下标(比如列表有1个元素时,下标就是0),而不是你通过publish传进来的counter数值本身
修正代码
直接取chunks里最后一个元素的值即可:
@Override protected void process(List<Integer> chunks) { int latestCounter = chunks.get(chunks.size() - 1); System.out.println(latestCounter + " / " + tickers.size()); }
要是你想处理每一次publish的数值(比如某次process被触发时,chunks里攒了好几个值),也可以遍历整个列表:
@Override protected void process(List<Integer> chunks) { for (int counter : chunks) { System.out.println(counter + " / " + tickers.size()); } }
额外说明
SwingWorker这么设计是为了减少对事件调度线程(EDT)的调用次数,避免频繁更新操作导致卡顿。所以chunks的长度不一定是1,得做好批量处理的准备。
内容的提问来源于stack exchange,提问作者BitQueen
相关产品推荐
相关产品推荐

