Android – Interrompere l'attività dal thread di rendering

Buon pomeriggio.

Non sono al corrente del ciclo di vita delle attività in android e ho letto leggermente il più bene ansible, ma non riesco a capire come risolvere in questo modo in modo piacevole.

  • Notifica multipla da GCM che non dirige per correggere l'attività
  • Il servizio in primo piano viene ucciso da Android
  • Android: Ottenere un file da http e memorizzare in SDCard
  • Eccezione del puntatore nullo nella function dei pulsanti
  • Accendere il vivavoce each volta che viene effettuata una chiamata in output
  • Gradiente circolare in android
  • Ho un'attività con un GLSurfaceView per disegnare varie cose sullo schermo. Nel thread di rendering per questo GLSurfaceView eseguo tutta la rendering e la logica di aggiornamento effettivo (lo separerò alla fine).

    Il problema che sto avendo è da uno degli "schermi" disegnati all'interno del renderer che voglio concludere l'attività e farlo call i vari methods del ciclo di vita.

    Normalmente potrò farlo con System.exit (0); tuttavia la fine dell'attività in questo modo non sembra call l'OnStop (); OnDestroy (); methods.

    Questo potrebbe essere solo essere stupido e non vedere un modo semplice per farlo, ma c'è un modo per accedere all'attività e call activity.finish (); senza wherer passare il riferimento a tutto il path?

    Questo è probabilmente less di una questione android e più un problema generale di java? Mi dispiace, sono un po 'arrugginito in entrambi. Forse se qualcuno potrebbe spiegare approssimativamente come gestire un problema come questo nella loro applicazione.

  • Passare l'arrays di stringhe al servizio web c # (Android Ksoap2)
  • Come verificare se un servizio è in esecuzione in Delphi 10 Seattle
  • Ricevi tutti gli argomenti sottoscritti da messaggistica cloud firebase
  • Rileva il certificato installato nel dispositivo Android
  • FragmentActivity che causa ClassNotFoundException
  • come includere il layout all'interno del layout in android
  • 3 Solutions collect form web for “Android – Interrompere l'attività dal thread di rendering”

    È necessario rispettare le regole di sicurezza dei thread e non call activity.finish () direttamente dal thread di rendering. Il modo migliore per gestire questo è quello di submit un runnable indietro nella coda degli events per la Thread UI. E lasciate che l'attività Runnable chiamata.finish ().

    Non è necessario passare l'attività verso l'area in cui si prevede di arrestare l'attività. Ecco cosa avrei fatto. Passare l'attività alla class che si installa in onCreate (). Qualcosa di simile a:

    public void onCreate( ... ) { MyRenderer renderer = new MyRenderer( glSurface, this ); } 

    Allora all'interno di MyRenderer avrei fatto qualcosa di simile:

     public void someMethodInRenderer() { if( stop ) { stop(); } } public void stop() { Handler handler = new Handler(); handler.post( new Runnable() { public void run() { activity.finish(); } } ); } 

    Notare il gestore utilizzato per submit nuovamente il thread UI. Questo rende più sicuro call attività.finish (). Non sono riuscito a trovare informazioni specifiche nei documenti che dicono che è sicuro o non è sicuro call finitura () da un altro thread in modo da essere sul lato sicuro riprenderlo.

    Cose da tenere in mente. Se someMethodInRenderer () è profondamente all'interno delle aree del tuo programma, allora non è necessario accedere direttamente all'istanza di attività. Hai solo bisogno di un riferimento in modo che qualcosa che alla fine chiami all'attività per finire. Quindi forse c'è un riferimento ad un'altra parte del sistema che stai passando a quel metodo where puoi aggiungere la stop (). Quindi stop () e someMethodInRenderer () potrebbero essere nella stessa class o in classi diverse. Questa è una scelta che devi fare. Alla fine questo è un problema di architettura che devi decidere.

    Se il thread renderer si trova all'interno dell'attività, è ansible utilizzare ActivityClassName.this.finish ();

    Per affrontare un problema, mi sono imbattuto in:

    Se finisci l'attività (anche da un altro thread) tramite activity.finish() , è importnte che il metodo onDraw() del thread di onDraw() non sia bloccato (è accaduto a causa della mia implementazione di rendering duplice tampone).

    In quel caso è stato chiamato solo il metodo onPause() nella class attività. I methods onStop() e onDestroy() non sono stati chiamati anche se l'applicazione è terminata con un breve ritardo.

    Spero che questo aiuti chiunque affrontare lo stesso problema.

    Modifica: Il motivo era che nel mio metodo activity.onPause() ho chiamato glSurfaceView.onPause() mentre l' glSurfaceView.onPause() del thread render è stato bloccato.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.