Try reading sensor packet 0 where you get all data back at once then extract the values you need into global variables to use anywhere else at any time in the app. The odometer data gets reset every time you request it from the robot so you need to accumulate each reading to get a running total. I'm not sure if reading the bumper data individually is resetting the odometer reading though (it shouldn't), but I've always read full sensor packets as opposed to reading one sensor at a time.
Ideally you should be reading the sensor data in a separate thread (or interrupt driven receive routine) so it happens continuously in the background while your app loops and references the the global variables without needing to poll and wait for the data.