安卓代码优化(定位篇)

安卓代码优化(定位篇)

安卓的定位加载

继续写安卓的代码优化!今天写点什么呢,写一个关于定位的优化吧。
在公司中,经常会遇到这样的需求。什么商家离你多少多少距离。那么我们经常用的是百度地图、高德地图的定位。为了不影响UI卡顿,一般定位三方都是在线程中处理定位信息,这样也是应该的。

所以,我们在使用的使用 要考虑 权限、定位成功、定位失败的问题。
还有多接口请求的时候,不需要定位接口是不是要放定位外面的问题。这样接口会不会走的快一些。
这这里提供的是 更新定位和请求接口分开。
实现定位接口同步。


目录

代码块

定位工具类:

package com.steptowin.eshop.common.tools;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationListener;
import com.steptowin.eshop.m.sql.bean.Location;
import com.steptowin.library.base.app.Pub;
import com.steptowin.map.amap.AMapWrapper;

/**
 * Created by fjw on 2017/3/28.
 */

public class LocationHelper {

    static LocationHelper intance;
    private AMapWrapper mapWrapper;
    private double lat;
    private double longitude;
    Location myLocation;

    public static LocationHelper getInstance() {
        synchronized (LocationHelper.class) {
            if (intance == null) {
                intance = new LocationHelper();
            }
            return intance;
        }
    }

    public void updateLocation() {
        mapWrapper = AMapWrapper.newInstance(null);
        mapWrapper.getLocation(new AMapLocationListener() {
            @Override
            public void onLocationChanged(AMapLocation aMapLocation) {
                if (aMapLocation.getErrorCode() == AMapLocation.LOCATION_SUCCESS) {
                    myLocation = Location.create(aMapLocation);
                    lat = aMapLocation.getLatitude();
                    longitude = aMapLocation.getLongitude();
                }
                //定位完就关掉
                mapWrapper.stop();
            }
        });
    }


    public String getDistance(String begin, String distance) {
        if (lat <= 0 || longitude <= 0 || Pub.IsStringEmpty(distance) || distance.equals("0"))
            return "暂无法获取距离";
        return begin == null ? "" : begin + distance + "km";
    }

    public double getLat() {
        updateLocation();
        return lat;
    }

    public void setLat(double lat) {
        this.lat = lat;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public Location getMyLocation() {
        updateLocation();
        return myLocation;
    }

    public void setMyLocation(Location myLocation) {
        this.myLocation = myLocation;
    }
}

代码思路解析:

Created with Raphaël 2.1.0 更新Helper池定位 更新Helper池定位 获取Helper池定位 获取Helper池定位 用Helper池的定位请求 用Helper池的定位请求 updateLocation() getLat() 、getLongitude()

getLat()或者getLongitude()可以去更新一下定位信息,刚进入更新的时候去更新一下。这样使用的时候只要

double lat = LocationHelper.getInstance().getLat();
        double longitude = LocationHelper.getInstance().getLongitude();
        DoHttp(new StwHttpConfig("你的地址")
                .put("lat",lat)
                .put("long", long)
                .setBack(new StwHttpCallBack<StwRetT<xxxx>>(getView(),
                        new TypeToken<StwRetT<xxx>>(){}){
                    @Override
                    public void onSuccess(StwRetT<xxxx> xxx) {
                        ....
                    }
                }));

我再也不用担心我的定位啦;也不用考虑定位失败的问题;
失败的处理:

    public String getDistance(String begin, String distance) {
        if (lat <= 0 || longitude <= 0 || Pub.IsStringEmpty(distance) || distance.equals("0"))
            return "暂无法获取距离";
        return begin == null ? "" : begin + distance + "km";
    }

高德地图错误是直接返回0;我这里判断如果0的话 就返回无法获取距离;如果后台返回“空”和“0”就是商家没有距离(这个和你们后台定义好就行)。这样的话 定位内容就全部统一处理了。

如果有人有强迫症,说那你不是永远都是加载上次的定位信息。
那么你可以在onCreate->updateLoction onResume去请求。我尝试过 ,高德的定位是是比这onCreate->onResume的时间要短; 这个你们也可以自己测试一下。如果对定位时间相差要求很高,可以使用这个方法。一般可以不用,基本上人都是不动。两种方式都可以,看你们需求而定。

总结

好了,定位优化就这里了,如果就是获取一下定位的 记得定位完就关掉哦,比较定位还是耗电和流量的。
过几天再见,上班上班。

注意:转发请注明转帖链接** http://blog.csdn.net/u011850446/article/details/71511422
安卓事件优化篇:http://blog.csdn.net/u011850446/article/details/71433900

猜你喜欢

转载自blog.csdn.net/u011850446/article/details/71511422