安卓代码优化(定位篇)
安卓的定位加载
继续写安卓的代码优化!今天写点什么呢,写一个关于定位的优化吧。
在公司中,经常会遇到这样的需求。什么商家离你多少多少距离。那么我们经常用的是百度地图、高德地图的定位。为了不影响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;
}
}
代码思路解析:
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。