我有一个带frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
的jframe。
在此JFrame上,我通过使用方法getBestFlipProfit()
(位于底部)导入API数据等来继续进行计算。
结果每3或4分钟显示在“框架”上(导入需要很长时间)。
我的问题是,当程序位于getBestFlipProfit()
调用getBestFlipProfit()
的JFrame方法:
private void containtRefresher(){
int delay = 100; // in milliseconds
ActionListener taskPerformer = evt -> {
Executor.getBestFlipProfit();
String res = "<html>";
for (String key: Executor.best_flips.keySet()) {
res += DataManager.get_item_name(key) + " profit = " +
Executor.best_flips.get(key).get("profit") + "<br>";
}
bestflips.setText(res + "</html>");
};
new Timer(delay, taskPerformer).start();
}
getBestFlipProfit()
方法:
您可以在Thread.sleep(70);
中看到try
,我认为问题是由此引起的,但是我不是100%确信,但是我无法删除它,因为那样导入API数据时会出错{ {1}}(=太快地执行请求)
只需说一句:当然有一种优化代码的方法,但这不是帖子的目的
429 Too Many Requests
答案 0 :(得分:1)
您可以使用预定的执行器服务。
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
private void containtRefresher(){
int delay = 100; // in milliseconds
Runnable taskPerformer = () -> {
Executor.getBestFlipProfit();
String res = "<html>";
for (String key: Executor.best_flips.keySet()) {
res += DataManager.get_item_name(key) + " profit = " +
Executor.best_flips.get(key).get("profit") + "<br>";
}
String html = res + "</html>";
EventQueue.invokeLater( ()-> bestflips.setText(html) );
};
ses.scheduleAtFixedRate(taskPerformer, delay, delay, TimeUnit.MILLISECONDS);
}
这应该与您所做的类似,但不会阻止EDT。当您关闭JFrame时,应用程序应退出,同时终止ExecutorService。
答案 1 :(得分:0)
我修复了它,我只需要像这样更改getBestFlipProfit
方法:
private void containtRefresher(){
while(true) {
Executor.getBestFlipProfit();
String res = "<html>";
for (String key: Executor.best_flips.keySet()) {
res += DataManager.get_item_name(key) + " profit = " + Executor.best_flips.get(key).get("profit") + ", amount = " + Executor.best_flips.get(key).get("amount") + "<br>";
}
bestflips.setText(res + "</html>");
this.panel.revalidate();
}
}