requestLocationUpdates()和removeUpdates(),无法使用TimerTask在单独的线程中处理

时间:2012-06-01 08:54:17

标签: android multithreading thread-safety android-service android-location

我在我的服务中使用Timer和TimerTask,我正在安排GPS定期使用此方法检查@ Service - onCreate()

  scheduleAllGPST.scheduleAtFixedRate(new AllGPSTimer(), 0, 
                                                everyInterval); 

我的服务类代码片段:

//class inside service class
class AllGPSTimer extends TimerTask {
   public void run() {
     if (!canGetLocation) stopLocationRequest();
     else requestLocation();
}
}
// Service class method
public void requestLocation() {
  try {
    locListener = new mylocationlistener();
    locationManager.requestLocationUpdates(provider, 0, 0, locListener);// Error happens at this line 
   }
  catch (Exception e) {
    e.printStackTrace();
  }
}
public void stopLocationRequest() {
 try {
    locationManager.removeUpdates(locListener);// And also it happens at this line 
 }
 catch (Exception e) {
    e.printStackTrace();
 }
}

我收到此错误:

Error :
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
 at android.os.Handler.<init>(Handler.java:121)
at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:139)
at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:137)
at android.location.LocationManager._requestLocationUpdates(LocationManager.java:708)
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:630)
at com.mobile.sales.GPSService.requestLocation(GPSService.java:146)
at com.mobile.sales.GPSService$AllGPSTimer.run(GPSService.java:140)
at java.util.Timer$TimerImpl.run(Timer.java:289)

从错误中,我猜这个requestLocationUpdates()和 removeUpdates()只能在Service类的Main线程中使用,而不能从主线程的衍生线程中使用。我猜对了吗?

那么Service类的Activity类中是否有类似runOnUiThread(runnable)的方法?

请帮助我处理位置API方法和计时器任务的衍生线程?如果我猜错了,请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:0)

公共类GpsManager {

public GpsManager()
{
    // TODO Auto-generated constructor stub
}

LocationManager lm;
LocationListener ll;

public void Start(Context context)
{
    lm = (LocationManager) context
            .getSystemService(Context.LOCATION_SERVICE);


    isactive = true;



    handler=new Handler(){

        @Override
        public void handleMessage(Message msg)
        {

            if(isactive)
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
            super.handleMessage(msg);
        }
    };
    ll = new MyLocationListener(context, lm,handler);
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
}

Handler handler;
public boolean isactive;

public void Stop()
{
    lm.removeUpdates(ll);
    isactive = false;
}

class MyLocationListener implements LocationListener
{

    Context _con;
    LocationManager _lm;

    Handler _handler;
    public MyLocationListener(Context con, LocationManager lm,Handler h)
    {
        _lm = lm;
        _con = con;
        _handler=handler;
    }

    @Override
    public void onLocationChanged(Location location)
    {
        if (location != null)
        {

            Toast.makeText(
                    _con,
                    "lon = " + location.getLongitude() + ". lat = "
                            + location.getLatitude(), Toast.LENGTH_SHORT)
                    .show();
            lm.removeUpdates(this);
            Thread th=new Thread(new Runnable()
            {

                @Override
                public void run()
                {
                    Message msg=Message.obtain();
                    _handler.sendMessageDelayed(msg,1000);

                }
            });
            th.run();
        }

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras)
    {

        Toast.makeText(_con, "status change " + provider,
                Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onProviderEnabled(String provider)
    {

        Toast.makeText(_con, "provider enable " + provider,
                Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onProviderDisabled(String provider)
    {

        Toast.makeText(_con, "provider disable " + provider,
                Toast.LENGTH_SHORT).show();
    }

}

}