Autore Topic: Terminare un thread correttamente  (Letto 961 volte)

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Terminare un thread correttamente
« il: 02 Marzo 2014, 16:39:55 CET »
0
Salve, di recente ho iniziato un po' con la gestione dei thread. Ho fatto un thread che va avanti all'infinito e viene richiamato da una SurfaceView. Ma ho un problema nella chiusura/riapertura dell'applicazione, ovvero ho messo che quando viene cliccata una certa zona della superficie il thread termina correttamente e non si ha problemi quando si riapre l'applicazione. Ma se invece premo il "tasto indietro" del dispositivo, non riesco più a riaprire correttamente l'applicazione, come posso fare a terminare correttamente il thread premendo il "tasto indietro" ?

Grazie mille anticipo  :D
Vincenzo Cimino @ Google Play Store


Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Terminare un thread correttamente
« Risposta #1 il: 02 Marzo 2014, 17:30:12 CET »
0
Quando esci con il "tasto indietro" verrà comunque chiamata una OnDestroy, ed è quella l'occasione di distruggere/fermare tutto quello che c'è da distruggere/fermare.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:Terminare un thread correttamente
« Risposta #2 il: 02 Marzo 2014, 23:08:08 CET »
0
E allora ho scritto questo metodo nella SurfaceView:

Codice (Java): [Seleziona]
@Override
        public void surfaceDestroyed(SurfaceHolder holder) {
                boolean retry = true;
                while (retry) {
                        try {
                                thread.join();
                                retry = false;
                        } catch (InterruptedException e) {
                                thread.setRunning(false);
                              ((MainActivity)getContext()).finish();
                        }
                }
        }

Ma non funge comunque  o_O
Vincenzo Cimino @ Google Play Store


Offline Hhaunted

Re:Terminare un thread correttamente
« Risposta #3 il: 03 Marzo 2014, 01:49:16 CET »
0
prova a chiamare thread.interrupt(); e non .setRunning();
Con quello si ferma di sicuro, o almeno "dice" all'os android di fermare il thread, poi decide l'os.

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:Terminare un thread correttamente
« Risposta #4 il: 03 Marzo 2014, 19:11:31 CET »
0
Ho risolto modificando il metodo in questa maniera:

Codice (Java): [Seleziona]
@Override
        public void surfaceDestroyed(SurfaceHolder holder) {
                Log.d(TAG, "Surface is being destroyed");
                        thread.setRunning(false);
                        ((MainActivity)getContext()).finish();
                Log.d(TAG, "Thread was shut down cleanly");
        }

Grazie mille  :D
« Ultima modifica: 04 Marzo 2014, 17:45:43 CET da Vincenzoz »
Vincenzo Cimino @ Google Play Store


Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Terminare un thread correttamente
« Risposta #5 il: 03 Marzo 2014, 19:19:20 CET »
0
Fatto, ma il problema è sempre lo stesso, che quando riapro l'applicazione la SurfaceView non viene avviata, ma resta l'activity vuota e dopo un po' crasha  :-o

Forse il problema è proprio nella riapertura. Per esempio perchè non ripassa dalla OnCreate, ma ad esempio dalla onStart o onResume, per cui devi gestire in quella parte di codice la creazione del thread e tutto il resto.

Quello che voglio dire è che, se hai codice che gira continuamente (Thread) e/o che deve essere inizializzato in qualche modo, metterei tutta la gestione nel passaggio dalle OnPause/OnResume. Per renderti conto del ciclo di vita dei Thread e della SurfaceView associata, metti dei Log.d() in corrispondenza della creazione e distruzioni dei vari oggetti. In questo modo puoi vedere dove passa e dove non passa quando si creano i problemi.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS7
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Terminare un thread correttamente
« Risposta #6 il: 04 Marzo 2014, 17:09:13 CET »
0
Scusa Vincenzoz, nel tuo codice non capisco il while (retry) con dentro l'istruzione retry = false.

Cioé è un ciclo con una ed una sola iterazione. In poche parole è un non-ciclo. Puoi togliere il while.

Oppure mi sfugge qualcosa?

Ciao.


Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:Terminare un thread correttamente
« Risposta #7 il: 04 Marzo 2014, 17:45:20 CET »
0
Si, scusami ho dimenticato di togliere il while, ma il codice finale è senza il ciclo :D
Vincenzo Cimino @ Google Play Store