我正在努力刮掉谷歌财经。 getStockInfoFromGoogle
方法存储两个字符串:(1)股票名称和(2)收盘价格为ObservableList<String>
。这很好用。
然后我尝试使用ScheduledService
在后台运行此方法,因此priceService
应返回ObservableList<String>
。
ObservableList<String>
时, 出现问题,因为我无法从列表中单独提取字符串并将它们与lastValueProperty()
相关联并且绑定到closingPrice属性。
我该如何解决这个问题? (我想在这里保留lastValueProperty()
)。
public class Trade{
private final ReadOnlyStringWrapper stockName;
private final ReadOnlyDoubleWrapper closingPrice;
private final ScheduledService<ObservableList<String>> priceService = new ScheduledService<ObservableList<String>>() {
@Override
public Task<ObservableList<String>> createTask(){
return new Task<ObservableList<String>>() {
@Override
public Number call() throws InterruptedException, IOException {
return getStockInfoFromGoogle();
}
};
}
};
// constructor
public Trade(){
priceService.setPeriod(Duration.seconds(100));
priceService.setOnFailed(e -> priceService.getException().printStackTrace());
this.closingPrice = new ReadOnlyDoubleWrapper(0);
this.stockName = new ReadOnlyStringWrapper("");
// this is the part where things goes wrong for the two properties below
this.closingPrice.bind(Double.parseDouble(priceService.lastValueProperty().get().get(1)));
this.stockName.bind(priceService.lastValueProperty().get().get(0));
}
public ObservableList<String> getStockInfoFromGoogle() throws InterruptedException, IOException{
ObservableList<String> output = FXCollections.observableArrayList();
// do some web scraping
output.add(googleStockName);
output.add(googleClosingPrice);
return output;
}
答案 0 :(得分:1)
你的设计看起来很混乱,因为Trade
类似乎都封装了一个交易(名称和价格),但似乎也在管理服务(它只是更新一个交易?)。
无论如何,在这里使用List
是不可取的,你应该创建一个类来封装你从服务中获得的数据:
class TradeInfo {
private final String name ;
private final double price ;
public TradeInfo(String name, double price) {
this.name = name ;
this.price = price ;
}
public String getName() {
return name ;
}
public double getPrice() {
return price ;
}
}
现在让你的ScheduledService
成为ScheduledService<TradeInfo>
等,然后就可以了
public TradeInfo getStockInfoFromGoogle() throws InterruptedException, IOException{
// do some web scraping
return new TradeInfo(googleStockName, googleClosingPrice);
}
现在创建绑定:
this.closingPrice.bind(Bindings.createDoubleBinding(() ->
priceService.getLastValue().getPrice(),
priceService.lastValueProperty());
this.stockName.bind(Bindings.createStringBinding(() ->
priceService.getLastValue().getName(),
priceService.lastValueProperty());
(您可能需要处理priceService.getLastValue()
为null
的情况。)