Местоположение Android Из службы каждые 10 секунд, но местоположение отображает Null, когда я изменил активность на службу

Я следил за это для получения координат местоположения каждые 10 секунд

Итак, теперь я хочу изменить действие на службу, чтобы я запускал ее как фоновую службу для получения обновлений о местоположении каждые 10 секунд...

Но здесь я изменил метод UpdateUI()

private void updateUI() {
    mLatitudeTextView.setText(String.format("%s: %f", mLatitudeLabel,
            mCurrentLocation.getLatitude()));
    mLongitudeTextView.setText(String.format("%s: %f", mLongitudeLabel,
            mCurrentLocation.getLongitude()));
    mLastUpdateTimeTextView.setText(String.format("%s: %s", mLastUpdateTimeLabel,
            mLastUpdateTime));
}

to

 private void updateUI() {

    try{
    mlatitude = String.valueOf(mCurrentLocation.getLatitude());
    mlongitude = String.valueOf(mCurrentLocation.getLongitude());
    }
    catch(Exception e){
        Toast.makeText(this,"Location Not Found",Toast.LENGTH_LONG).show();
    }
}

И я поджариваю эти значения в onStartCommand(), и я дал команду запуска, подобную этой

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        buildGoogleApiClient();
        mRequestingLocationUpdates = true;
        updateUI();

        return mStartMode;  
}

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

Однако в действии все работает нормально, я получаю обновления местоположения каждые 10 секунд...

Может ли кто-нибудь предложить, как дать то же самое в сервисе... чтобы я получал обновления

Обновление 1: чтобы запускать службу каждые 10 секунд, я добавил это...

private final Integer TEN_SECONDS = 10000;
    public void sendSendLocation() {
    new Handler().postDelayed(new Runnable() {
            public void run () {
                updateUI();
                new Handler().postDelayed(this, TEN_SECONDS);
            }
    },TEN_SECONDS);
}

Но здесь местоположение отображает нулевое значение... Может ли кто-нибудь предложить мне...

Обновление 2:

На самом деле, мне нужно добавить updateValuesFromBundle(savedInstanceState) в OnStartCommand, если я его добавлю... Служба будет работать. Но, следовательно, это услуга, которую я не могу оказать Bundle savedInstanceState...

private void updateValuesFromBundle(Bundle savedInstanceState) {
        Log.i(TAG, "Updating values from bundle");
        if (savedInstanceState != null) {
            // Update the value of mRequestingLocationUpdates from the Bundle, and make sure that
            // the Start Updates and Stop Updates buttons are correctly enabled or disabled.
            if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
                mRequestingLocationUpdates = savedInstanceState.getBoolean(
                        REQUESTING_LOCATION_UPDATES_KEY);
                setButtonsEnabledState();
            }

            // Update the value of mCurrentLocation from the Bundle and update the UI to show the
            // correct latitude and longitude.
            if (savedInstanceState.keySet().contains(LOCATION_KEY)) {
                // Since LOCATION_KEY was found in the Bundle, we can be sure that mCurrentLocation
                // is not null.
                mCurrentLocation = savedInstanceState.getParcelable(LOCATION_KEY);
            }

            // Update the value of mLastUpdateTime from the Bundle and update the UI.
            if (savedInstanceState.keySet().contains(LAST_UPDATED_TIME_STRING_KEY)) {
                mLastUpdateTime = savedInstanceState.getString(LAST_UPDATED_TIME_STRING_KEY);
            }
            updateUI();
        }
    }

Итак, я бегу UpdateUI() прямо в OnStartCommand() на службе

Кто-нибудь предложит мне на этот вид?


person Whats Going On    schedule 15.03.2018    source источник
comment
@ MLN: Вы также следуете по указанной выше ссылке для обслуживания?   -  person Jitesh Mohite    schedule 17.03.2018
comment
Да, я использую весь код приложения в Github. Но я изменил/создал MainActivity для обслуживания... Я запускаю новую службу и службу. Ссылка на этот код...   -  person Whats Going On    schedule 19.03.2018
comment
Вы не можете часто получать сведения о местоположении из фоновой службы на устройстве с Android 8.0.   -  person Thracian    schedule 21.03.2018


Ответы (3)


Вы можете использовать обработчик или timertask.

Некоторые из зарегистрированных проблем с TimerTask:

  • Не удается обновить поток пользовательского интерфейса
  • Утечки памяти
  • Ненадежный (не всегда работает)
  • Длительные задачи могут помешать следующему запланированному событию

Обработчик:

 private final Integer TEN_SECONDS = 10000;
    public void sendSendLocation() {
    new Handler().postDelayed(new Runnable() {
            public void run () {
                updateUI();
                new Handler().postDelayed(this, TEN_SECONDS);
            }
    },TEN_SECONDS);
}
person Community    schedule 15.03.2018
comment
Я попробовал ваш код, но здесь местоположение не работает... Я думаю, что это не обновление местоположения... Мне нужно подумать об этом... - person Whats Going On; 16.03.2018
comment
новый обработчик().postDelayed(это, ДЕСЯТЬ СЕКОНД); что этот код делает внутри обработчика? Думаю, нам это не нужно. - person Jitesh Mohite; 17.03.2018
comment
может быть это также необходимо, потому что, когда эта служба запустилась, ей нужно некоторое время, чтобы получить сведения о местоположении ... например, адрес, поэтому я использую это, но всего 3 секунды задержки - person Whats Going On; 19.03.2018
comment
@MLN прав. Возможно, вы можете попробовать спящий режим перед запуском службы. - person ; 19.03.2018
comment
Анонимные обработчики на самом деле являются самым простым способом утечки Activity. Воздержитесь от этого. Лучше всего использовать статический класс Handler со слабой ссылкой на Activity. Однако проблема с обновлением местоположения может быть связана с тем, что в Android 8.0 введены ограничения по местоположению, если вы используете устройство с Android 8.0 и выше. - person Thracian; 21.03.2018

Попробуйте этот код

private void startProcess(){
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
          updateUI();  
        }
    }, 0, 10000);
}

Этот метод startProcess записывается в метод startCommand

person Chetan Kumar Patel    schedule 15.03.2018
comment
Я получаю это исключение java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() после добавления вашего кода - person Whats Going On; 16.03.2018

Следуйте этому..... ваш код правильный, но onConnected() не используется... если вы используете его в сервисе.. вы должны добавить эту строку...... В вашем коде вы можете использовать googleApiclient.connect();

Итак, в вашем коде

protected synchronized void buildGoogleApiClient() {
    Log.i(TAG, "Building GoogleApiClient");
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
    mGoogleApiClient.connect(); **// Add this line**
    createLocationRequest();
}

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

person ravi    schedule 21.03.2018