У меня возникают проблемы с подклассом AsyncTask.Не удается отменить запуск AsyncTask
У меня есть основное действие, как показано ниже, которое отображает кнопку и число, которое подсчитывается на экране. При нажатии кнопки запускается действие «Редактировать», в котором можно ввести номер.
Число, отображаемое в основном действии, должно обновляться с помощью таймера, который он выполняет, но проблема, с которой я сталкиваюсь, заключается в том, что я не могу остановить таймер. Он должен останавливаться при входе в действие «Редактировать» и возврате из него, а также перезапускаться с новым значением, но это не так, таймер всегда работает с первым введенным значением, он никогда не останавливается, даже когда я ухожу программы и вернуться на главный экран.
Я смотрел сообщения здесь, такие как Can't cancel Async task in android, но все они просто упоминают проверку на isCancelled(), которую я делаю. Может ли кто-нибудь увидеть/объяснить, почему я не могу остановить эту AsyncTask?
public class MainActivity extends Activity {
@Override
UpdateTimer ut;
TextView tvn;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onResume() {
super.onResume();
tvn = (TextView) findViewById(R.id.numDisplay);
if(ut != null)//&& ut.getStatus() == AsyncTask.Status.RUNNING) {
ut.cancel(true);
ut.cancelled = true;
Log.d("-----M_r","called cancel: "+ut.isCancelled()+" "+cancelled);
}
if (updateRequired) {
ut = new UpdateTimer();
ut.execute(number);
updateRequired = false;
}
}
public void onEditButtonPressed(View caller) {
// kill any running timer
if(ut != null)
{
ut.cancel(true);
ut.cancelled = true;
}
// start the edit screen
Intent e_intent = new Intent(this, EditActivity.class);
startActivity(e_intent);
}
private void updateScreen(long number) {
// update screen with current values
tvn.setText("" + number);
}
private class UpdateTimer extends AsyncTask<Long, Long, Integer> {
long number;
public boolean cancelled;
@Override
protected Integer doInBackground(Long... params) {
number = params[0];
cancelled = false;
while(true) {
number += 1;
//sleep for 1 second
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// tell this AsyncTask to update the time on screen
publishProgress(number);
// check if timer needs to stop
if (isCancelled()) break;
if(cancelled) break;
}
return null;
}
protected void onProgressUpdate(Long... progress) {
Log.d("-----M_ut","updated: "+number+" "+this.isCancelled()+" "+cancelled);
updateScreen(progress[0]);
}
protected void onCancelled(Integer result) {
cancelled = true;
Log.d("-----M_ut","-- cancelled called: "+this.isCancelled());
}
}
protected void onStop()
{
super.onStop();
// kill any running timer
if(ut != null) {
ut.cancel(true);
}
}
}
Спасибо за предложение, но оно не сработало. Я забыл упомянуть перед тем, что строки журнала вернутся в отношении isCancelled, за исключением одного в onProgressUpdate. –