在预定线程上请求位置更新

时间:2017-03-09 22:07:18

标签: java android gps

我正在处理的Android应用程序要求每15分钟记录一次GPS位置。为了最大限度地减少GPS使用以保持电池寿命,我想使用ScheduledExecutorService开始请求位置更新,然后在发生位置更改后关闭请求。由于错误,我当前的实现不允许这样做:

Can't create handler inside thread that has not called Looper.prepare()

我知道的是因为我无法在后台线程中进行LocationManager调用。

启动调度程序的代码:

locationFinder = new LocationFinder(context);
final Runnable gpsBeeper = new Runnable()
    {
        public void run()
        {
            try {
                locationFinder.getLocation();;
            }
            catch (Exception e)
            {
                Log.e(TAG,"error in executing: It will no longer be run!: " + e.getMessage());
                e.printStackTrace();
            }
        }
    };

  gpsHandle = scheduler.scheduleAtFixedRate(gpsBeeper, 0, 15, MINUTES);

LocationFinder类:

public LocationFinder(Context context)
{
    this.mContext = context;
}

public void getLocation()
{

    locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
    isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (isGPSEnabled)
    {
        try
        {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, updateInterval, distance, this);
        }
        catch (SecurityException s)
        {
            s.printStackTrace();
        }
    }
}

public void stopUpdates(){
    locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
    locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location)
{
    latitude = location.getLatitude();
    longitude = location.getLongitude();
    isGPSUpdated = true;
    stopUpdates();
}

如何在不依赖主线程调用requestLocationUpdates的情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

您的设置遇到的问题是,如果应用被操作系统杀死或用户滑动应用关闭它,它将停止记录您的位置更新。实际上,无论应用程序的状态如何,您都可以采用2种方法来获得定时更新间隔(除非应用程序被强制杀死)。

  1. 使用LocationManagerrequestLocationUpdates()方法将更新间隔设置为15分钟,使用PendingIntent代替LocationListener来确保您继续接收更新,而无需持有对侦听器的引用。如果您需要知道是否已经请求更新,只需使用SharedPreferences来保留布尔标志。

  2. 另一个是使用AlarmManager来安排将调用IntentService(用于在后台运行)或BroadcastReceiver(用于在前台运行)的更新致电LocationManager requestSingleUpdate()方法以获取GPS更新。