Per un certo periodo anch'io ho sospettato che il thread fosse da ricreare e infatti uso il metodo interrupt, ma il thread non viene cancellato.
Infatti seguendo la sequenza dei log quando passo all'activity SearchContent viene eseguito il metodo _thread.interrupt() che attiva il metodo surfaceDestroyed.
Quando ritorno all'activity Panel viene attivato il metodo surfaceCreated all'interno del quale evito di richiamare il metodo _thread.start perchè si pianta, eseguo quindi il metodo _thread.run in modo che riprende a loopare e ad eseguire il metodo panel.draw, che disegna il panel con sfondo bianco e i rettangoli fino a quel momento creati.
Tutto viene eseguito ma niente viene disegnato. E come se la classe panel si fosse staccata dalla classe draw dove è stata creata in origine.
Spero di essere stato chiaro.
Potrei sbagliarmi ma credo che l'errore sia proprio in quello che stai facendo.
Da quello che so io:
- Il codice che viene eseguito in un thread separato è quello all'interno di run()
- Per far partire il thread non si può chiamare run() direttamente, ma si usa start()
- Un thread può essere avviato SOLO UNA VOLTA (ecco come mai ti crasha se provi a farlo ripartire con start)
- Se richiamo run() non fai ripartire il thread, ma semplicemente esegui run() come una funzione
Puoi ovviamente controllare se il thread sta girando al ritorno dall'activity, grazie a Log.d("DEBUG", "run"); che hai messo nel loop.
Secondo me se sposti la creazione di una nuova istanza di thread, e il relativo start(), in onSurfaceCreated, dovrebbe riprendere ad andare.