2012-02-03 2 views
0

У меня AsyncTask, и мой прогресс в фоновом режиме находится в бесконечном цикле. Но мне нужно остановить AsyncTask, когда пользователь останавливает мое приложение или возвращается из моего приложения (мое приложение переходит на передний план). Как мне это сделать?Как остановить AsyncTask в бесконечном цикле?

Решение:

частное булево сделано = ложь;

private class CurTask extends AsyncTask<String, Void, Object> { 
     protected Void doInBackground(String... args) { 
      while(!done){ 
       DefaultCurProgress();   
       publishProgress(); 
      } 
     } 

     protected void onProgressUpdate(Void...unused) { 
      textCur = (TextView)findViewById(R.id.text_cur); 

      SharedPreferences myPrefs = MyActivity.this.getSharedPreferences("myPrefs", MODE_PRIVATE); 
      String prefNameDefaultCur = myPrefs.getString(DefaultCur, ""); 

      textCur.setText(prefNameDefaultCur); 
     } 
} 

@Override 
    public void onPause(){ 
     super.onPause(); 
     done=true; 
    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     done=false; 
    } 
+0

Как и в любом потоке, должно быть возможно использовать флаг '' while (keepRunning == true) ''. – harism

ответ

4

Объявите метод в вашем AsyncTask, который говорит его до конца. Что-то вроде этого:

private class CurTask extends AsyncTask<String, Void, Object> { 
    private boolean done = false; 

    public void quit() { 
     done = true; 
    } 

    protected Void doInBackground(String... args) { 
     while(!done){ 
      DefaultCurProgress();   
      publishProgress(); 
     } 
    } 
+0

Но как я могу позвонить quit(), когда моя активность или приложение остановлено? – Adam

+0

Из метода 'onPause()' вашей операции вызывают его? –

+0

Да, я подумал, но я не хотел переделывать ваш код. Теперь это работает, спасибо. Код будет вверх. – Adam

0

Добавить булеву переменную-член и использовать его в вашем состоянии в то время как вместо истинного.

Затем, когда вам нужно отменить его, вы можете просто вызвать метод экземпляра, чтобы установить эту переменную в false, метод doInBackground вернется и задача завершится.