Domanda

Creo un timer ritardato di 1 minuto per spegnere il servizio se non è completato. Somiglia a questo:

private Handler timeoutHandler = new Handler();

all'interno di OnCreate ()

timeoutHandler.postDelayed(new Runnable()
        {
            public void run()
            {
                Log.d(LOG_TAG, "timeoutHandler:run");

                DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute");
                finalizeService();
            }
        }, 60 * 1000);

Se ricevo un lavoro realizzato prima di questo 1 minuto, vorrei cancellare questa cosa ritardata ma non sono sicuro di come.

È stato utile?

Soluzione

Non puoi davvero farlo con un anonimo Runnable. Che ne dici di salvare il runnable su una variabile denominata?

Runnable finalizer = new Runnable()
    {
        public void run()
        {
            Log.d(LOG_TAG, "timeoutHandler:run");

            DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute");
            finalizeService();
        }
    };
timeoutHandler.postDelayed(finalizer, 60 * 1000);

...

// Cancel the runnable
timeoutHandler.removeCallbacks(finalizer);

Altri suggerimenti

Se non vuoi mantenere un riferimento di Runnable, potresti semplicemente chiamare:

timeoutHandler.removeCallbacksAndMessages(null);

La documentazione ufficiale dice:

... Se il token è nullo, tutti i callback e i messaggi verranno rimossi.

Potresti voler sostituire l'uso di postDelayed Con l'uso di sendMessageDelayed così:

private Handler timeoutHandler = new Handler(){
    @Override
    public void handleMessage(Message msg)
    {
            switch (msg.what){
        case 1:
            ((Runnable)msg.obj).run();
            break;
        }
    }
};

Quindi pubblica un messaggio:

Message m = Message.obtain();
m.what = 1;
m.obj = new Runnable(){
            public void run()
            {
                Log.d(LOG_TAG, "timeoutHandler:run");

                DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute");
                finalizeService();
            }
        };
timeoutHandler.sendMessageDelayed(m, 60 * 1000);

e poi annulla:

timeoutHandler.removeMessages(1);

Nessun tracciamento del Runnable necessario.

Se ricevo un lavoro realizzato prima di questo 1 minuto, vorrei cancellare questa cosa ritardata ma non sono sicuro di come.

Uso Handler.removeCallbacks(yourRunnable).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top