0

サービスで Timer と TimerTask を使用しており、このメソッド @ Service - onCreate() を使用して GPS を定期的にチェックするようにスケジュールしています。

  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 クラスの 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 に答える