0

我在我的服务中使用 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 类的主线程中使用,而不是从主线程的衍生线程中使用。我猜对了吗?

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

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

谢谢!

4

1 回答 1

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();
    }

}

}

于 2014-12-22T04:00:36.520 回答