android在后台获取位置并更新listview
Posted
技术标签:
【中文标题】android在后台获取位置并更新listview【英文标题】:android get location in background and update listview 【发布时间】:2014-12-31 10:46:06 【问题描述】:我正在尝试编写一个应用程序,该应用程序使用用户的当前位置并计算距离并将其写入我的列表视图。
位置不必非常准确,我只想在列表刷新或应用启动时获取新位置,而不是连续获取。
我的问题是带有 gps 的 locationlistener 需要很长时间才能找到一个位置,我必须在它显示正确的距离之前更新我的列表。
我正在考虑实现一个后台任务,该任务获取位置并在找到位置时自动更新列表。这会是一个解决方案吗?
是否有任何选项可以更快地获取位置,即使它不如 gps 准确?
到目前为止我的位置监听器有什么:
public class MyLocationListener implements LocationListener
@Override
public void onLocationChanged(Location location)
lat = location.getLatitude();
lng = location.getLongitude();
myLoc.setLatitude(lat);
myLoc.setLongitude(lng);
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
@Override
public void onProviderEnabled(String provider)
@Override
public void onProviderDisabled(String provider)
在这种方法中,我调用 locationmanager 和 listener 并创建具有距离的列表视图
public void getList()
locationManager = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE);
locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
//... creating the list with distance and so on
我希望你能给我一些提示,我可以如何实现这一点,我将按照上述方式工作,或者告诉我应该使用什么来代替。 谢谢:)
【问题讨论】:
您可以使用 getLastKnownLocation 方法更快地获取位置。您也可以尝试从网络获取位置。尝试阅读位置 API 以了解更多详细信息 【参考方案1】:1)。您可以使用 LocationManager.NETWORK_PROVIDER
此提供商根据手机信号塔和 WiFi 接入点的可用性确定位置。通过网络查找检索结果。需要权限 android.permission.ACCESS_COARSE_LOCATION 或 android.permission.ACCESS_FINE_LOCATION。
例如:- locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 500, 50, locationListener);
2)。如果您想使用后台任务,请使用此服务
public class LocationFinder extends Service
public static double lat, lng;
LocationManager locationManager;
public void onDestroy()
super.onDestroy();
if (locationManager != null && locationListener != null)
locationManager.removeUpdates(locationListener);
@Override
public void onCreate()
Log.v("location", "===>location ed onCreate " + lat);
super.onCreate();
@Override
public int onStartCommand(Intent intent, int flags, int startId)
super.onStartCommand(intent, flags, startId);
Log.v("location", "===>location ed onStartCommand " + lat + "==>" + lng);
new Handler().post(new Runnable()
@Override
public void run()
// TODO Auto-generated method stub
getLocation();
);
return START_STICKY;
final LocationListener locationListener = new LocationListener()
public void onLocationChanged(Location location)
updateWithNewLocation(location);
public void onProviderDisabled(String provider)
updateWithNewLocation(null);
public void onProviderEnabled(String provider)
public void onStatusChanged(String provider, int status, Bundle extras)
;
private void getLocation()
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager) getSystemService(context);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
if (locationManager != null)
String provider = locationManager.getBestProvider(criteria, true);
if (provider != null)
Location location = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);
locationManager.requestLocationUpdates(provider, 500, 50, locationListener);
else
if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 500, 50, locationListener);
else if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 50, locationListener);
else if (locationManager.isProviderEnabled(LocationManager.PASSIVE_PROVIDER))
locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 500, 50, locationListener);
private void updateWithNewLocation(Location location)
if (location != null)
Log.v("location", "===>location ed " + lat);
lat = location.getLatitude();
lng = location.getLongitude();
@Override
public IBinder onBind(Intent intent)
// TODO Auto-generated method stub
return null;
【讨论】:
非常感谢:)。您认为出于我的目的有必要将其作为后台任务运行吗?以上是关于android在后台获取位置并更新listview的主要内容,如果未能解决你的问题,请参考以下文章