Другое решение этой известной проблемы.К сожалению, я не понимаю, почему это работает - это вышло случайно.Но это работает хорошо для меня, и его легко реализовать: нет переопределения Activity
onPause()
, onResume()
, onStart()
, onStop()
, а также написание специальных потоковых методов (таких как resume()
, pause()
) являются обязательными.
Особое требование - поместить все изменяющиеся переменные в нечто отличное от класса потока рендеринга.
Основные моменты, которые нужно добавить в класс потока рендеринга:
class RefresherThread extends Thread {
static SurfaceHolder threadSurfaceHolder;
static YourAppViewClass threadView;
static boolean running;
public void run (){
while(running){
//your amazing draw/logic cycle goes here
}
}
}
Важнокое-что о YourAppViewClass
:
class YourAppViewClass extends SurfaceView implements SurfaceHolder.Callback {
static RefresherThread surfaceThread;
public YourAppViewClass(Activity inpParentActivity) {
getHolder().addCallback(this);
RefresherThread.threadSurfaceHolder = getHolder();
RefresherThread.threadView = this;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
surfaceThread = new RefresherThread();
surfaceThread.running=true;
surfaceThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
surfaceThread.running=false;
try {
surfaceThread.join();
} catch (InterruptedException e) {
}
}
}
Два кодовых блока выше - это не полностью написанные классы, а просто представление о том, какие команды в каких методах нужны.Также обратите внимание, что каждое возвращение в приложение вызывает surfaceChanged()
.
Извините за такой объемный ответ.Я надеюсь, что это будет работать должным образом и поможет.