双检锁/双重校验缩(DCL,即double-checked locking)
public class SetDataBase {
private volatile static SetDataBase mInstance;
private SetDataBase() {
}
public static SetDataBase getInstance() {
if (mInstance == null) {
synchronized (SetDataBase.class) {
if (mInstance == null) {
mInstance = new SetDataBase();
}
}
}
return mInstance;
}
}
采用DLC模式,两层判断当线程A调用该方法,没初始化完成的的时,这时候内存指针指向了null,线程B再进行调用时,第一次判断,顺利进入,当没有第二层判断,就会出错,所以再添加一层判断,并通过synchronized 加锁,这时候,B就可以知道A在调用,并进入等待状态,等待线程A的调用结束/所以DLC保证了线程的安全,并保证只构建一个对象。
Location服务之Geocoder
利用android原生的Geocoder函数,输入经纬度,判断用户所在的位置
Geocoder可以在街道地址和经纬度地图坐标之间进行转换。它提供了对两种地理编码功能的访问
private static String convertAddress(Context context, double latitude, double longitude) {
Geocoder mGeocoder = new Geocoder(context, Locale.getDefault());
StringBuilder mStringBuilder = new StringBuilder();
try {
List<Address> mAddresses = mGeocoder.getFromLocation(latitude, longitude, 1);
if (!mAddresses.isEmpty()) {
Address address = mAddresses.get(0);
mStringBuilder.append(address.getAdminArea()).append(", ").append(address.getLocality()).append(", ").append(address.getCountryName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
网友评论