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的主要内容,如果未能解决你的问题,请参考以下文章

在后台服务中使用融合位置获取GPS更新前(15分钟)?

Android:线程从网络加载数据后更新Listview

Android:在 ListView 中移动项目的窗口?

Android获取服务器Json字符串并显示在ListView上面

定期停止获取后台位置更新

android listview 获取 edittext内容 并保存