Требуется помощь относительно местоположения, таймера и сервиса

#android

#Android

Вопрос:

Вот мой код:

основной класс обслуживания

 public class SimpleService extends Service {
Timer mytimer;
private String provider;

//LocationManager locationManager;
//LocationListener mlocListener;
//private Handler toasthandler = new Handler();

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    Toast.makeText(this,"Service created ...", Toast.LENGTH_LONG).show();
    mytimer = new Timer();
    mytimer.schedule(new TimerTask() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            toastHandler.sendEmptyMessage(0);


        }
    },0,1000);

}

@Override
public void onDestroy() {
    super.onDestroy();
    Toast.makeText(this, "Service destroyed ...", Toast.LENGTH_LONG).show();
    mytimer.cancel();
}
private final Handler toastHandler=new Handler()
{
    public void handleMessage(Message msg) 
    {
        getdata();
    };
};
public void getdata()
{
    LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    LocationListener mlocListener = new MyLocationListener();
    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            mlocListener);
    // Initialize the location fields


}
public class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location loc) {
        loc.getLatitude();
        loc.getLongitude();
        String Text = "My current location is: "   "Latitude = "
                  loc.getLatitude()   "Longitude = "   loc.getLongitude();
        Toast.makeText(getApplicationContext(), Text, Toast.LENGTH_SHORT)
                .show();
        Log.d("TAG", "Starting..");
    }

    @Override
    public void onProviderDisabled(String provider) {
        Toast.makeText(getApplicationContext(), "Gps Disabled",
                Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onProviderEnabled(String provider) {
        Toast.makeText(getApplicationContext(), "Gps Enabled",
                Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
} //End of Class MyLocationListener */

}
  

Здесь я использовал таймер в службе для вызова requestLocationUpdate() метода через каждую 1 секунду, но этот метод не вызывается. Когда я нажимаю кнопку из DDMS, чем все TAG.D печатаются одновременно.
Вывод в журнале cat выглядит следующим образом:

 05-11 15:47:29.763: DEBUG/dalvikvm(308): GC_EXPLICIT freed 47 objects / 2264 bytes in 59ms
05-11 15:47:34.904: DEBUG/dalvikvm(190): GC_EXPLICIT freed 88 objects / 3856 bytes in 151ms
05-11 15:47:36.294: DEBUG/TAG(3677): Starting..
05-11 15:47:36.294: DEBUG/TAG(3677): Starting..
05-11 15:47:36.294: DEBUG/TAG(2449): Starting..
05-11 15:47:36.524: DEBUG/TAG(3677): Starting..
05-11 15:47:36.534: DEBUG/TAG(3677): Starting..
05-11 15:47:36.544: DEBUG/TAG(3677): Starting..
05-11 15:47:36.554: DEBUG/TAG(3677): Starting..
05-11 15:47:36.564: DEBUG/TAG(3677): Starting..
05-11 15:47:36.574: DEBUG/TAG(3677): Starting..
05-11 15:47:36.594: DEBUG/TAG(3677): Starting..
05-11 15:47:36.604: DEBUG/TAG(3677): Starting..
05-11 15:47:36.614: DEBUG/TAG(3677): Starting..
05-11 15:47:36.624: DEBUG/TAG(3677): Starting..
05-11 15:47:36.635: DEBUG/TAG(3677): Starting..
05-11 15:47:36.644: DEBUG/TAG(3677): Starting..
05-11 15:47:36.664: DEBUG/TAG(3677): Starting..
05-11 15:47:36.674: DEBUG/TAG(3677): Starting..
05-11 15:47:36.694: DEBUG/TAG(3677): Starting..
05-11 15:47:36.704: DEBUG/TAG(3677): Starting..
05-11 15:47:36.714: DEBUG/TAG(3677): Starting..
05-11 15:47:36.734: DEBUG/TAG(3677): Starting..
05-11 15:47:44.394: DEBUG/dalvikvm(58): GREF has increased to 401
05-11 15:47:47.734: DEBUG/dalvikvm(2449): GC_EXPLICIT freed 372 objects / 20424 bytes in 149ms
05-11 15:47:53.663: DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol
  

Не могли бы вы, пожалуйста, сказать, что происходит не так в коде?

Ответ №1:

Вам не нужно использовать таймер для запроса обновлений местоположения. Как только вы зарегистрируетесь для получения обновлений местоположения, вы будете получать уведомления о каждом событии изменения местоположения.

Рассмотрим следующий пример:

 public class SimpleService extends Service {
    Timer mytimer;
    private String provider;

    LocationListener mlocListener = new LocationListener {
        @Override
        public void onLocationChanged(Location loc) {
            loc.getLatitude();
            loc.getLongitude();
            String Text = "My current location is: "   "Latitude = "
                  loc.getLatitude()   "Longitude = "   loc.getLongitude();
            Toast.makeText(getApplicationContext(), Text, Toast.LENGTH_SHORT)
                .show();
            Log.d("TAG", "Starting..");
        }

        @Override
        public void onProviderDisabled(String provider) {
            Toast.makeText(getApplicationContext(), "Gps Disabled", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onProviderEnabled(String provider) {
            Toast.makeText(getApplicationContext(), "Gps Enabled",
                Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    } //End of Class MyLocationListener */;


    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this,"Service created ...", Toast.LENGTH_LONG).show();


        LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            mlocListener );
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        mlocManager.removeUpdates(mlocListener);
        Toast.makeText(this, "Service destroyed ...", Toast.LENGTH_LONG).show();
    }
}