Кажется, что происходит каждый раз, когда вы блокируете экран, а затем возобновляете его, делая еще один Runnable
поверх Runnable
, у вас уже есть удвоение цикла, таким образом, заставляя поток двигаться быстрее и быстрее каждый раз, когда вам нужно чтобы как-то приостановить ваш поток, например, thread.sleep()
или что-то подобное, когда вы блокируете экран, чтобы при возобновлении вы не воссоздали новый Runnable
, а вместо этого просто начали с того места, где остановились в своем потоке.
Если вы делаете новый Runnable
методом onCreate
. Он будет вызываться в любое время, когда телефон поворачивается, или когда телефон возобновляет работу и т. Д., И именно поэтому у вас, вероятно, возникает эта проблема. Причина, по которой это не происходит после finish()
вашей активности или закрытия приложения, заключается в том, что при перезапуске приложения Runnable
будет создан один раз, пока вы не начнете блокировать телефон и не возобновите его снова и т. Д.
вы также можете захотеть взглянуть на внутренний класс, который вы можете использовать для обработки ваших потоков:
public class YourClass extends Activity {
public void yourUpdateMethod() {
runOnUiThread(new Runnable() {
public void run() {
new YourUpdateClass().execute(0, null, null);
}
});
}
private class YourUpdateClass extends AsyncTask<Integer, Void, Void> {
@Override
protected synchronized Void doInBackground(Integer... index) {
return null;
}
@Override
protected synchronized void onPostExecute(Void result) {
//your statements here
}
}
}
Это может помочь обработать потоки, которые должны быть приостановлены / перезапущены / возобновлены или что-то немного лучше. Более подробная информация здесь: http://developer.android.com/reference/android/os/AsyncTask.html
Не знаю, как это будет работать в игре, но с этим не поиграл.
Удачи, надеюсь, это поможет.