我正在尝试实现一个基于加利福尼亚的CoAP客户端。我让这个客户端观察一个资源:
public static class CoapCl{
double val = 0;
CoapClient client = new CoapClient("coap://localhost/Ultrasonic");
CoapObserveRelation relation = client.observe(new CoapHandler() {
@Override public void onLoad(CoapResponse response)
{
val = Double.parseDouble(response.getResponseText());
}
@Override
public void onError() {
System.out.println("Failed");
}
});
}我想从另一个类访问值"val“。我该怎么做呢?我尝试从CoapCl类调用一个引用,如下所示,并将值打印出来:
CoapCl client = new CoapCl();
while(true)
{
System.out.println("Testing: " + client.val);
} 这将打印我从CoAP客户机获得的所有值,包括更改的值和未更改的值。如果我只想获取更改后的值,该怎么办?
发布于 2017-08-10 18:40:39
好吧,这个问题本身与Californium和CoAP无关。除了CoapHandler是异步的,但这是一个相当困难的问题。尽管如此,我还是建议以某种回调结束:
public class CoapCl {
private final Consumer<Double> valueChangedAction;
private final CoapClient client = new CoapClient("coap://localhost/Ultrasonic");
public CoapCl(Consumer<Double> valueChangedAction) {
this.valueChangedAction = valueChangedAction;
}
public void run() {
client.observe(new CoapHandler() {
@Override
public void onLoad(CoapResponse response) {
valueChangedAction.accept(
Double.parseDouble(
response.getResponseText()
)
);
}
@Override
public void onError() {
System.out.println("Failed");
}
});
}
}
new CoapCl(val -> System.out.println("Testing: " + val)).run();请记住,您必须以某种方式阻塞主线程,以防止程序立即退出。以前,您已经用无限循环阻止了它。现在,如果您的程序中还没有这样的东西,那么您将不得不使用System.in.read()或Thread.sleep或其他东西。
https://stackoverflow.com/questions/45572259
复制相似问题