This can NullPointerException if you ever get a cancel call from a thread other than the main thread. Since Retrofit isn't strictly an Android library, that's a very real possibility. (and due to the way Java memory works, you can't just reverse the order of the two assignments in the cancel method above.)

I think this code becomes simpler if you drop the `isCanceled` field and use only the callback field. If it's null use it, otherwise don't.