UI.getCurrent() obtains the reference from thread local, which present only in the request thread and hence is always returning null in background thread, i.e. when you call this in then accept of the Future.
getUI() obtains UI reference from the component and is having a value if the component is attached. In long running process it is totally possible that user closes the browser or navigates to other view (does not have patience to wait), hence component is no longer attached. In that case it is correct not to update the view either as it is no longer there.
After reloading the page
See my comment above about closing the browser. Reloading the page does something similar. The current page is discarded, a new UI is created etc. So old one is no longer attached, hence getUI() is not having a value.