If you want to poll at a fixed framerate, it's best not to use a listener. Just query controller.frame() at fixed intervals. For example, our Unity examples use the game loop and thus may poll at 60 fps, or less depending on the target refresh rate.
Giving up the listener also removes the overhead of dealing with multiple threads and synchronization.