I faced the same problem. My WS always returned the whole object I requested. So I manage that the server stores for each object its last updated time by using System.currentTimeMillis() in every setters.
When you consume your WS you retrieve the response and keep the last updated time. For the next request to the WS, you'll send this stored time.
So the server will send you only the difference. Of course, it leads to a modification of your server's code.
I don't know if it's a clean solution, but it works fine. I've got approximatively the same time response in Wifi and in 3G.
You can also use gzip to compress the message.
HeaderProperty headerProperty=new HeaderProperty("Accept-Encoding", "gzip");
You can see a sample here