onStop () - более надежное место для размещения timer.cancel () (или обоих мест, если вы хотите охватить почти каждую ситуацию, например, обстоятельства, указанные в конце здесь ).
onPause () вызывается не в каждой ситуации, она используется, когда onResume () имеет достаточную вероятность, например, когда вы переходите к другому действию и затем возвращаетесь.Обратите внимание на отступ в схеме жизненного цикла .Может не вызываться при нажатии кнопки «назад».
РЕДАКТ. 1: это предварительный ответ, поэтому он может не охватывать проблему принудительного закрытия.
РЕДАКТ. 2:
@Override
public void onStop(){
super.onStop();
try {
timer.cancel();
} catch (Exception ex) {
Log.e("MY APP ERROR", ex.getMessage());
}
}
I всегда ставил вызов super первым в этих методах жизненного цикла.Я не уверен, если это имеет значение.Вы, вероятно, захотите установить оператор try / catch, особенно если вы решите включить timer.cancel () в onStop () И onPause ().
РЕДАКТИРОВАТЬ 3: О готовности признать поражение,Я не очень знаком с особенностями ScheduledExecutorService, и, поскольку вы заявили, что готовы переписать, вот как я добился того же в своих приложениях.Handler - это реализация для Android, поэтому, возможно, именно поэтому у меня не было таких проблем, как у вас.
Handler timer;
Runnable runner;
@Override
onCreate(...) {
...
//EDIT 4: (reading time from preferences)
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
final int c = Integer.parseInt(SP.getString("appRefreshRate","20"));
...
runner = new Runnable() {
@Override
public void run() {
timer.postDelayed(runner, c * 1000);
webview.reload();
}
};
timer = new Handler();
timer.postDelayed(runner, c * 1000);
...
}
@Override
public void onPause(){
super.onPause();
try {
timer.removeCallbacks(runner);
} catch (Exception ex) {
Log.e("MY APP ERROR", ex.getMessage());
}
}
@Override
public void onStop(){
super.onStop();
try {
timer.removeCallbacks(runner);
} catch (Exception ex) {
Log.e("MY APP ERROR", ex.getMessage());
}
}