Триггеры-обработчики запускают - PullRequest
0 голосов
/ 21 октября 2018

Мое приложение записывает элементы поля, чтобы помочь картостроителям разрабатывать карты ориентирования, используя сотовый телефон GPS.Путевая точка или дорожка пути сохраняются в формате .gpx, а темп записи можно регулировать в диапазоне от 2 до 6 секунд @ Предпочтение.

Проверка выполняется путем сравнения временного окна телефона со спутниковым, используяпочтовый обработчик задержки.Спутниковый сигнал проверяется один раз каждые 8 ​​раз интервала записи.Он запускается только на резюме и просит остановиться на паузе.Перед тем, как его запустить, необходимо вызвать любой обработчик на месте.Обработчик также ожидает 30 секунд для стабилизации сигнала.

По причинам, которые не определены, иногда более одного обработчика активны одновременно, что приводит к сбою проверки сигнала, так как значение времени спутника становится меньше, чем у телефона´с одним.Я могу заставить проблему (иногда) появляться, если я перехожу к Предпочтениям и возвращаюсь к основному приложению менее чем за временной интервал (8-кратный интервал записи).

Тостовые сообщения и r предназначены для отладкитолько.

Что я делаю не так?

@Override
protected void onResume() {
super.onResume();
    // ...
    //
    //Set the timers that will supervise the GPS signal activity
    /*
     * Compare timers to see if the satellites still visible within a time window
     */
    Date currentTime = Calendar.getInstance().getTime();
    mPhoneActualTime = currentTime.getTime();
    mPhonePreviousTime = mPhoneActualTime;

    Toast.makeText(Oribooklet.this,"Kill - RESUME", Toast.LENGTH_SHORT).show();
    handler.removeCallbacksAndMessages(null);
    checkGPS();
}
//
    public void onPause() {
    super.onPause();
    Toast.makeText(Oribooklet.this,"Kill - PAUSE", Toast.LENGTH_SHORT).show();
    handler.removeCallbacksAndMessages(null);
}
//
// A Handler is responsible to check if we loose the satellites
// Start 30 seconds after GPS is on to allow stabilization.
// Check every 8 GPS data update to not overload
public void checkGPS() {
    Handler handler = new Handler();
    Toast.makeText(Oribooklet.this, "Trigger", Toast.LENGTH_SHORT).show();
    handler.postDelayed(checkGPSSignalLoss, 30 * 1000);
}

private ProgressBar progressBar;
private int r;

private Runnable checkGPSSignalLoss = new Runnable() {
    @Override
    public void run() {
        progressBar = (ProgressBar) findViewById(R.id.progress);
        progressBar.setVisibility(View.INVISIBLE);

        Date currentTime = Calendar.getInstance().getTime();
        mPhoneActualTime = currentTime.getTime();
        // Use 70% as a GPS communication error of real time
        long phoneTimeDifference = (long) (0.7 * (mPhoneActualTime - mPhonePreviousTime));
        long gpsTimeDifference = mGPSActualTime - mGPSPreviousTime;
        mPhonePreviousTime = mPhoneActualTime;
        mGPSPreviousTime = mGPSActualTime;

        ++r;
        Toast.makeText(Oribooklet.this, gpsTimeDifference + " " +
                        phoneTimeDifference + " - " +
                        String.valueOf(r)
                , Toast.LENGTH_SHORT).show();

        // Check the time difference between the 2 GPS recordings above
        // It must be at least 10% higher than real time, if not, the satellites are gone!
        if (gpsTimeDifference < phoneTimeDifference ){
            // Change UI
            String textGPS = getResources().getString(R.string.waiting);
            TextView textOut = (TextView) findViewById(R.id.textSatellites);

            // Set a turning progress bar and a message to feedback the loss
            progressBar = (ProgressBar) findViewById(R.id.progress);
            textOut.setText(textGPS);
            progressBar.setVisibility(View.VISIBLE);
        }

        // Check every 8X the GPS communication interval
        handler.postDelayed(this, lTimerToUpdateGPS);
    }
};
...