UI 线程上的多线程
Multi-threading on UI Thread
我需要实时更新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 {
}
能否请您指出这种方法有什么问题?
从你的代码我可以看出你的刷新没有更新到 GUI 或者你的 GUI 正在快速闪烁。
更新 GUI 的经验法则是:
- 通过单独的线程在后端更新数据。如果需要,使用双缓冲。
- 在
SwingUtilities.invokeLater()
内调用所有 GUI 更新,以便在 EDT 线程内完成更新。
我需要实时更新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 {
}
能否请您指出这种方法有什么问题?
从你的代码我可以看出你的刷新没有更新到 GUI 或者你的 GUI 正在快速闪烁。
更新 GUI 的经验法则是:
- 通过单独的线程在后端更新数据。如果需要,使用双缓冲。
- 在
SwingUtilities.invokeLater()
内调用所有 GUI 更新,以便在 EDT 线程内完成更新。