Вам необходимо соблюдать правила безопасности потока и не вызывать activity.finish () непосредственно из вашего потока рендеринга. Лучший способ справиться с этим - отправить работоспособный объект обратно в очередь событий для потока пользовательского интерфейса. И пусть этот Runnable вызовет activity.finish ().
Вам не нужно передавать упражнение в ту область, где вы планируете его остановить. Вот что я сделаю. Передайте действие классу, который вы создаете в onCreate (). Что-то вроде:
public void onCreate( ... ) {
MyRenderer renderer = new MyRenderer( glSurface, this );
}
Тогда внутри MyRenderer я бы сделал что-то вроде:
public void someMethodInRenderer() {
if( stop ) {
stop();
}
}
public void stop() {
Handler handler = new Handler();
handler.post( new Runnable() {
public void run() {
activity.finish();
}
} );
}
Обратите внимание на обработчик, используемый для отправки обратно в поток пользовательского интерфейса. Это позволяет безопасно вызывать activity.finish (). Я не смог найти какую-либо конкретную информацию в документах о том, что безопасно или небезопасно вызывать finish () из другого потока, чтобы быть в безопасности после публикации.
Что нужно иметь в виду. Если someMethodInRenderer () глубоко в недрах вашей программы, вам не нужно иметь доступ напрямую к экземпляру действия. Вам просто нужна ссылка, чтобы что-то, что в конечном итоге вызывает действие, чтобы закончить. Так что, возможно, есть ссылка на другую часть системы, которую вы передаете этому методу, где вы можете добавить stop (). Поэтому stop () и someMethodInRenderer () могут находиться в одном классе или в разных классах. Это выбор, который вы должны сделать. В конце концов, это проблема архитектуры, которую вы должны решить.