android 单例(DCL) 与Location服务之Geocoder

双检锁/双重校验缩(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
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(); } }

你可能感兴趣的:(android 单例(DCL) 与Location服务之Geocoder)