You shouldn’t call chartboost.show() immediately after the chartboost.cache() call. If you do, you don’t give a chance for the listener to be called and you have no idea if an ad has been cached or not. You have to wait a while before calling show().
As a rule you’d call chartboost.cache() at the start/resume of the app, and when you reach a point in your code where you want to display an ad, you check if an ad is cached and only then call show() if there is one available.