主要通过SystemClock.elapsedRealtime()来实现
实现原理:首先获取服务器时间,并记录获取服务器时间时当时的时钟值,当要重新获取服务器时间时,只需要用当前的时钟值-获取服务器时间时当时的时钟值+之前的服务器时间=现在的服务器时间
核心代码:
df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 服务器时间
serverTime = new Date(); // 这里取本地时间,为了测试
// 开机之后会保持一个时钟(绝对时间)
C1 = SystemClock.elapsedRealtime();
showText = (TextView)findViewById(R.id.showText);
Button button = (Button)findViewById(R.id.testButton);
button.setText("当前时间:"+df.format(serverTime));
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
C2 = SystemClock.elapsedRealtime();
// 当前时间=服务器时间+时间差
Date curDate = new Date(serverTime.getTime()+(C2-C1));
String s = df.format(curDate);
showText.setText("最新当前时间:"+s);
}
});
应用场景描述:比如拍照图片上加服务器时间水印
旧的思路,每次拍照的时候获取服务器时间,这样回导致拍照很慢,因为每次请求接口耗费了大量的时间
新的思路,只获取一次服务器时间,后续的服务器时间通过时钟差来计算获得,是不是快多了呢
源码
https://github.com/andli0626/ServerTimeTest.git