2013-12-23 3 views
1

У меня возникают проблемы с подклассом 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); 
    } 
} 

}

ответ

0

Попробуйте ... удалить переменную .. cancelled и изменение этого ..

@Override 
protected void onCancelled() { 
    super.onCancelled(); 
} 

Вызовите super.onCancelled вместо ..

И в doInBackground проверка

if (isCancelled()) { 
    break; 
} 

Попробуйте позвонить из вашей деятельности ut.cancel(true);

Надеется, что это работает :)

+0

Спасибо за предложение, но оно не сработало. Я забыл упомянуть перед тем, что строки журнала вернутся в отношении isCancelled, за исключением одного в onProgressUpdate. –

0
private YourAsyncTask ut; 

объявить AsyncTask в вашей деятельности.

ut = new YourAsyncTask().execute(); 

его экземпляр, как это.

ut.cancel(true); 

убийство/отменить его, как это.

+0

Спасибо, но это не сработало. Я не могу понять, почему isCancelled возвращает true извне, кроме doInBackground и onProgressUpdate. –

Смежные вопросы