我的一个实现类中的方法需要很长时间才能完成,并且使我的视图冻结.因此,这些方法必须是线程化的!
所有这些方法都使用HashMaps或Lists返回数据.
我的控制器正在通过调用它们来获取数据,然后将它们传递给View.
我不知道应该在哪里创建线程.
它应该在Controller层中还是在实现类中(以及因为我那里有很多方法而如何).
另外,我仅在线程工作完成时才需要刷新视图.
这些方法将被重新调用.
我真的迷失了所遇到的所有线程技术.
控制器:
SomeParser someParser = new FirstParserImpl();
HashMap<String,String> map = someParser.parseSomething();
loadTableView(map);
FirstParserImpl:
public HashMap<String,String> parseSomething() {
//opening http connection, scrape and parse data. This takes long time!
return map;
}
解决方法:
使用Task
.您可以直接在控制器类中执行此操作:
Task<Map<String, String>> parseDataTask = new Task<Map<String, String>>() {
@Override
public Map<String, String> call() {
SomeParser someParser = new FirstParserImpl();
return someParser.parseSomething();
}
};
parseDataTask.setOnSucceeded(e -> {
Map<String,String> parseResults = parseDataTask.getValue();
// update UI here with parseResults, e.g:
loadTableView(parseResults);
});
Thread t = new Thread(parseDataTask);
t.setDaemon(true);
t.start();