进行同步的一种简单方法是将上次更新的时间戳传递给服务器。然后,服务器要么给出一个空响应(无更新),要么给出自该时间戳以来更新的对象列表。在这两种情况下,它都会提供一个新的时间戳,因此客户端不必与服务器保持同步。
要求POST /WebService.asmx/GetUpdates
<GetUpdates>
<Timestamp>2012-07-19T13:42:13Z</Timestamp>
<UpdateNow>True</UpdateNow>
</GetUpdates>
如果该客户端没有先前的更新,则传递一个空的时间戳,或者将其忽略。设置UpdateNow
为False
, 以查看是否有任何更新(<Objects>
将始终为空)。
回复
<Updates>
<Timestamp>2012-07-23T17:54:13Z</Timestamp>
<Count>23</Count>
<Objects>
<Object>...</Object>
<Object>...</Object>
...
</Objects>
</Updates>
或者
<Updates>
<Timestamp>2012-07-19T13:42:13Z</Timestamp>
<Count>0</Count>
<Objects/>
</Updates>
<Timestamp>
可以是请求的时间,也可以是最新更新的时间。
处理:解析 XML,并将其写入SQLite 数据库。保存时间戳以备将来更新。
要向 Web 服务发出实际请求,您可以使用kSoap2 for Android:
public SoapObject GetUpdates(String timestamp, boolean updateNow) {
SoapObject request = new SoapObject("http://tempuri.org/", "GetUpdates");
request.addProperty("Timestamp", timestmap);
request.addProperty("UpdateNow", updateNow ? "True" : "False");
SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
HttpTransportSE transport = new HttpTransportSE(
"http://www.example.com/WebService.asmx/GetUpdates");
transport.call("GetUpdates", envelope);
return (SoapObject) transport.bodyIn;
}