之前写的那一篇呢,好像有点点问题。就是在设定监听的时候,没有编写具体监听的方法。
今天带来一篇新的方式的合约监听
前面的就不赘述了。合约上的监听是一样的。
在java中。根据abi生产的文件,其实在里面是有监听方法的
代码如下:
public Flowable<StoEventResponse> stoEventFlowable(EthFilter filter) {
return web3j.ethLogFlowable(filter).map(new Function<Log, StoEventResponse>() {
@Override
public StoEventResponse apply(Log log) {
EventValuesWithLog eventValues = extractEventParametersWithLog(STO_EVENT, log);
StoEventResponse typedResponse = new StoEventResponse();
typedResponse.log = log;
typedResponse.number = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
return typedResponse;
}
});
}
实际上呢,在初始化合约后,直接使用合约调取监听。会比后期写监听方便一些。
这里方便的点有如下几点:
1.不用手动转换数据类型,可以拿到直接使用
2.不用装配监听的方法等。(底层已实现)
具体调用如下。(钱包加载,管理器加载,合约地址这些也不赘述了)
Storage storage = Storage.load(address, web3j, transactionManager, gasPrice, Contract.GAS_LIMIT);
BigInteger staBlock = web3j.ethBlockNumber().send().getBlockNumber();
storage.stoEventFlowable(DefaultBlockParameter.valueOf(staBlock), DefaultBlockParameterName.LATEST).subscribe(tx -> {
System.out.println(tx.number);
});
是不是比上一篇方便很多。