Se a sincronização leva 5 minutos e a 3G é instável, você poderia fazer uma sincronização em partes de um lote.
Se tem 1000 registros para sincronizar, vai mandando de 25 em 25 ( ou em uma proporção maior ) e a sincronização terminasse só quando o status de todos os registros fosse sincronizado.
Faria um método getTotalSync que retornaria o total de registros.
Na sequência criaria um getPartialSync(part) que receberia parte dos registros.
No final de cada getPartialSync, verificaria se a sincronização foi completa.
Caso for, finaliza, se não, chama novamente o getPartialSync com a próxima parte. Caso não tenha recebido, por causa de um timeout ou outro erro, requisita a mesma parte novamente.
Abraço,
Fredy.