Служба Android: дождитесь ответа от получателя широковещательной рассылки в задаче таймера - PullRequest
0 голосов
/ 19 апреля 2019

Хорошо, из-за отсутствия у меня опыта работы с Android, возможно, я немного ошибся, однако все работает.Иногда я получаю неожиданный результат.Вот сильно сокращенный код с использованием Timer:

    private Timer timer;
    private TimerTask timerTask;

    public void startTimer() {
        timer = new Timer();
        initializeTimerTask();
        timer.schedule(timerTask, 10000, 10000);
    }

public void initializeTimerTask() {
    timerTask = new TimerTask() {
        public void run() {
        runSendJob(jsonData, SentReceiver);

        // wait up to 10 seconds for response from broadcast receiver
        long startTime = System.currentTimeMillis();
        while(bResult.equals(false) && (System.currentTimeMillis()-startTime)<10000){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
             e.printStackTrace();
        }


        if (bResult.equals(true)){
            UpdateLog();
            }
         }
    };
}
}

initializeTimerTask () работает нормально каждые 10 секунд, когда «на холостом ходу» ничего не нужно делать, но если runSendJob выполняет какую-то работу, выполнение может занять 10-20 секунд во время ожиданиядля ответа BroadcastReceiver установите флаг возврата и продолжайте, затем таймер сразу же запустится снова.

Я хочу подождать 10 секунд, поэтому я изменил следующее.Кажется, теперь это работает хорошо, ожидая 10 секунд, прежде чем снова ездить на велосипеде (спасибо за подсказку @notTdar);

public class MyService extends Service {

BroadcastReceiver SentReceiver;
public Boolean bResult;

@Override
public void onCreate() {
    super.onCreate();
    mHandler = new Handler();
    commandStart()
}

private void commandStart() {
        if (mExecutor == null) {
            mExecutor = Executors.newSingleThreadScheduledExecutor();
            Runnable runnable =
                    new Runnable() {
                        @Override
                        public void run() {
                            startMyTask();
                        }
                    };
            mExecutor.scheduleWithFixedDelay(runnable, DELAY_0, DELAY_10, DELAY_SECONDS);
        d(TAG, "commandStart: starting executor");
    } else {
        d(TAG, "commandStart: do nothing");
    }

DeliveredReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        switch(getResultCode()) {
            case Activity.RESULT_OK:
            bResult = true;
                break;
            case Activity.RESULT_CANCELED:
            bResult = false;
                break;
        }
    }
}; 

    registerReceiver(SentReceiver, new IntentFilter("MSG_SENT"));
}

public void startMyTask() {

    runSendJob(jsonData, SentReceiver);

    // wait up to 10 seconds for response from broadcast receiver
    long startTime = System.currentTimeMillis();
    while(bResult.equals(false) && (System.currentTimeMillis()-startTime)<10000){
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
         e.printStackTrace();
    }

    if (bResult.equals(true)){
        UpdateLog();
        }

    // spin off other jobs here if I want to...
    mHandler.post(
            new Runnable() {
                @Override
                public void run() {
                    updateSomethingElse();
                }
            });
}
}
...