When you decorate a function with @ui.in_background, it will always return None. This is by design – the entire point of ui.in_background is basically to return immediately, without blocking, and when it returns, the result of the actual function call is not yet known.
In your case, I would recommend moving the ask_unzip action into the App class (don't forget the additional self parameter), and then calling some kind of do_unzip method if the alert comes back with a confirmation. So basically, you'd split the unzip method in two, one that just shows the alert, and the other one that does the actual unzipping, and which you call separately when the alert returns in the background. I hope that makes sense.