2015-07-03 5 views
0

У меня есть AsyncTask, который загружает контент и помещает его на экран. Вот код:AsyncTask в Android не выйдет

private class ContentLoader extends AsyncTask<Void, Void, Void>{ 
    private boolean running = false; 

    protected Void doInBackground(Void... params){ 
     running = true; 
     while (running){ 
      try { 
       publishProgress(); 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { 
       Log.d("ContentLoader", String.valueOf(e)); 
      } 
     } 
     return null; 
    } 

    protected void onProgressUpdate(Void... progressParams){ 
     setContents(); 
    } 

    public void exit(){ 
     Log.d("ContentLoader-exit before", String.valueOf(running)); 
     running = false; 
     Log.d("ContentLoader-exit after", String.valueOf(running)); 
    } 
} 

В setContents() - метод загружает некоторый текст из SQLite-базы данных и устанавливает его в TextViews, что все работает хорошо, пока я пытаюсь выйти из задачи. Когда я вызываю метод exit, обе регистрационные записи показывают значение «false», и цикл продолжается.

Я называю задачу из OnCreate-метода моей деятельности:

public class MainActivity extends ActionBarActivity { 
ContentLoader contentLoader = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    contentLoader = new ContentLoader(); 
    contentLoader.execute(); 
} 

Я хочу, чтобы бросить в onBackPressed:

@Override 
public void onBackPressed(){ 
    super.onBackPressed(); 
    if (contentLoader != null){ 
     contentLoader.exit(); 
    } 
    finish(); 

Итак, как можно получить эту вещь, чтобы выйти? Спасибо за ваши ответы!

+1

где вы устанавливаете running = false? внутри doInBackground? – iGoDa

+0

Внутри метода выхода между протоколированием. –

+0

sry, я имел в виду, что вы не вызываете метод exit внутри (работает), поэтому задача async не будет выходить – iGoDa

ответ

0

попробуйте использовать метод cancel для отмены AsyncTask и используйте метод isCancelled в состоянии цикла while.

Вот пример:

private class ContentLoader extends AsyncTask<Void, Void, Void>{ 

    protected Void doInBackground(Void... params){ 
     running = true; 
     while (!isCancelled()){ 
      try { 
       publishProgress(); 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { 
       Log.d("ContentLoader", String.valueOf(e)); 
      } 
     } 
     return null; 
    } 

    protected void onProgressUpdate(Void... progressParams){ 
     setContents(); 
    } 

} 

Затем используйте cancel метод отменить задание

ContentLoader contentLoader = new ContentLoader(); 
contentLoader.execute(); 
contentLoader.cancel(true); 
0

Использовать обычные contentLoader.cancel(boolean mayInteruptIfRunning) где логическое mayInteruptIfRunning если это правда будет ПРЕРЫВАЙТЕ работает нить еще это позволит ему завершить, а затем отменить.

И вы можете проверить состояние с помощью contentLoader.isCancelled()

0

Вы должны использовать cancel Mathod:

@Override 
public void onBackPressed(){ 
    super.onBackPressed(); 
    if (contentLoader != null){ 
     contentLoader.cancel(); 
    } 
    finish(); 

Если AsyncTask имеет петлю сделать:

@Override 
Void doInBackground(Void... params) { 
    for(;;) 
     if(isCancelled()) 
      return null; 
} 

Если вы используя что-то вроде URLConnection, сделайте это

@Override 
Void doInBackground(Void... params) { 
    URLConnetcion uc = new URLConnection(new URL()); 

    if(isCancelled()) 
     return null; 
    else 
     //your normal processing 
     process(); 
}