JavascriptProva

domenica 13 novembre 2016

Conflitti nell'attivazione del timer.

Vado cercando il modo di schematizzare quando sia necessario avere il timer in funzione e quando no.
Cerchiamo di iniziare dalle cose più semplici.

Innanzitutto, quando si avvia il programma il timer è già in funzione.
Questo innesca, dopo una quantità di minuti prestabilita, la comparsa della Activity B.
L'Activity B, una volta chiusa, innnesca di nuovo il timer per la ricomparsa di se stessa, e così via, fin quando non si interrompa il timer mediante un pulsante presente sull'Activity A.
Il primo timer è innescato da A, il secondo sempre da B che si richiama da solo alla scadenza del tempo prestabilito.

E' possibile che, se si schiaccia due volte il pulsante su A che innesca il timer, si abbiano due timer, in modo che B appaia due volte, ossia che ne vengano aperte più istanze?
Questo sarebbe problematico, e devo verificarlo.
Nel mio caso, il timer si avvia all'accensione dello switch.
Questo timer dovrebbe essere l'unico avviato dall'activity A.
Quindi dovrebbe proseguire l'innesco automatico del timer da parte dell'activity B che richiama se stessa.
Ci sono però altre tre occasioni in cui viene innescato il timer esternamente al normale ciclo dell'activity B che richiama se stessa:
  1. alla conferma di una nuova voce;
  2. alla pressione del tasto VISUALIZZA (indirettamente mediante apertura di activity B con successivo innesco del timer);
  3. dall'activity SETTINGS nell'evento onPause (se questo prelude al ritorno all'Activity A).
Me li rinfresco da codice:
        bttConferma=(Button)findViewById(R.id.bttConferma);
        bttConferma.setEnabled(false);
        bttConferma.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                helper.save(lista.get(0));
                bttConferma.setEnabled(false);
                bottone.setEnabled(true);
                avviaTimer();
                mOnAlarmChangeListener.OnAlarmChange();
            }
        });
        bttVisualizza=(Button)findViewById(R.id.bttVisualizza);
        bttVisualizza.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                cancellaTimer();
                Intent intent=new Intent(getApplicationContext(),Lista.class);
                startActivity(intent);
            }
        });


Activity SETTINGS:
    @Override
    protected void onPause(){
        super.onPause();

        if(permessoAvvioTimer)avviaTimer();
    }
Se il timer viene innescato da una di queste e successivamente dall'altra, si hanno due cicli di Timer sovrapposti.
Provo a causarlo coscientemente togliendo cancellaTimer() quando viene visualizzata l'altra activity dal pulsante su A.
        bttVisualizza=(Button)findViewById(R.id.bttVisualizza);
        bttVisualizza.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                //cancellaTimer();
                Intent intent=new Intent(getApplicationContext(),Lista.class);
                startActivity(intent);
            }
        });
E proviamo ad accendere l'interruttore e prima che si apra B a visualizzarla col pulsante.

Sì, ottengo un conflitto e vengono aperte due istanze di B!
Forse l'unica è inserire un cancellaTimer() ogni volta prima che il timer venga innescato esternamente.
Lo faccio nei punti prima considerati:
1) Interruttore:
        switch1.setOnCheckedChangeListener(new Switch.OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    cancellaTimer();
                    avviaTimer();
                    mOnAlarmChangeListener.OnAlarmChange();
                }else{
                    cancellaTimer();
                    mOnAlarmChangeListener.OnAlarmChange();
                }
            }
        });


2) Conferma di una nuova voce:
        bttConferma.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                helper.save(lista.get(0));
                bttConferma.setEnabled(false);
                bottone.setEnabled(true);
                txtVocale.setText(null);
                cancellaTimer();
                avviaTimer();
                mOnAlarmChangeListener.OnAlarmChange();
            }
        });


3) Pressione del tasto Visualizza:
        bttVisualizza.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                cancellaTimer();
                Intent intent=new Intent(getApplicationContext(),Lista.class);
                startActivity(intent);
            }
        });
4) Da SETTINGS in onPause:
    @Override
    protected void onPause(){
        super.onPause();

        if(permessoAvvioTimer){
            cancellaTimer();
            avviaTimer();
        }
    }


Dovrei essere piuttosto sicuro, adesso...

Semplifico il codice dell'interruttore:
        switch1.setOnCheckedChangeListener(new Switch.OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                cancellaTimer();
                if(isChecked) avviaTimer();
                
                mOnAlarmChangeListener.OnAlarmChange();
                
                
            }
        });
E ora sperimentiamo nel tempo...

Nessun commento:

Posta un commento