Downloading of tiles should be in separate threads so that each connection to a tile server has its own thread.
Connections to tile servers should use the "keep alive" feature. At the moment for every tile a new connection is created.
Perhaps create an (abstract) interface / abstract class TileProvider? Not sure, if there is an use case.