【问题标题】:Multi-threading on UI ThreadUI线程上的多线程
【发布时间】:2015-10-19 20:03:55
【问题描述】:

我需要实时更新 6 个图表。因此,我为每个图形创建了一个单独的队列,并尝试使用 timer.schedule 更新它,但它并没有真正起作用。特别是,如果我评论每个 timer.schedule 的调用并只保留第一个调用,它会运行良好。但即使我添加了第二个 timer.schedule (所以只有 1 个和 2 个定时器)它会冻结。这是我使用的代码:

timer_graph1 = new Timer();
timer_graph1.schedule(new Graph1(), 20, 20);
timer_graph2 = new Timer();
timer_graph2.schedule(new Graph2(), 20, 20);
timer_graph3 = new Timer();
timer_graph3.schedule(new Graph3(), 20, 20);
timer_graph4 = new Timer();
timer_graph4.schedule(new Graph4(), 20, 20);
timer_graph5 = new Timer();
timer_graph5.schedule(new Graph5(), 20, 20);
timer_graph6 = new Timer();
timer_graph6.schedule(new Graph6(), 20, 20);

class Graph1 extends TimerTask {

    public void run() {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //add data to the graph and update
                mChart1.invalidate();
            }
        });

    }
}

//same structure as for Graph1
class Graph2 extends TimerTask {

}

您能否建议这种方法有什么问题?

【问题讨论】:

  • 欢迎来到 Stack Overflow,但你能解释一下 doesn't really work 的意思吗?
  • 特别是,如果我评论每个 timer.schedule 的调用并只留下第一个调用,它就会很好地工作。但即使我添加第二个 timer.schedule (所以只有 1 和 2 个计时器)它会冻结。

标签: java android multithreading timer scheduled-tasks


【解决方案1】:

从您的代码中,我可以看出您的刷新没有更新到 GUI,或者您的 GUI 正在快速闪烁。

更新 GUI 的经验法则是:

  1. 通过单独的线程在后端更新数据。如果需要,请使用双缓冲。
  2. SwingUtilities.invokeLater() 内调用所有 GUI 更新,以便在 EDT 线程内完成更新。

【讨论】:

  • IIRC invalidate 可以安全地调用任何线程;它告诉主线程稍后重绘这个组件。
  • @immibis 是的。好久没接触Java GUI了,谢谢提醒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2011-11-25
相关资源
最近更新 更多