2013-03-14 3 views
3

Я хочу запустить поток (который выполняет некоторую трудоемкую задачу в фоновом режиме и не обновляет интерфейс), он просто загружает некоторые файлы из Интернета и не зависит от пользовательского интерфейса.Как запустить поток несколько раз после некоторого интервала

Я хочу запустить эту ветку повторно через некоторый промежуток времени.

Как я могу это сделать, у меня есть нить что-то, как показано ниже:

boolean mResult =false; 

void onCreate() 
{ 
    DownloadThread mDownloadThread = new DownloadThread(); 
    mDownloadThread.start(); 
} 

class DownloadThread extends Thread implements Runnable 
{ 
    public void run() 
    { 
     // My download code 
     mResult = result; 
    } 
} 

мне нужно использовать Handler для реализации этого?

ответ

4

Для достижения этой цели я бы использовал Timer. Попробуйте следующее:

void onCreate() 
{ 
    Timer t = new Timer(); 
    t.scheduleAtFixedRate(new TimerTask() { 

     @Override 
     public void run() { 
      // Download your stuff 
     } 

    }, 0, 1000); 
} 

Это начинается немедленно, и метод run вызывается каждую секунду.

выбор
7

Предпочитаемый является

java.util.concurrent.ScheduledExecutorService 

Новые и надёжная реализация Подробнее здесь ScheduledExecutorService

+1

Лучший ответ пока, это должен быть принят ответ;) – mana

18

Вариант 1:

volatile boolean flag = true; 

public void run() 
{ 
    while(flag) 
    {  
     // Do your task 
     try{ 
      Thread.Sleep(interval); 
     } catch(Exception e){ 

     } 

    } 
} 

Вариант 2:

Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 

    @Override 
    public void run() { 
     // Do your task 
    } 

}, 0, interval); 

Вариант 3:

volatile boolean flag = true; 

public void someMethod(){ 
    // Do your task 
    try{ 
     Thread.Sleep(interval); 
    } catch(Exception e){ 

    } 
    if(flag) 
     return; 
    else 
     someMethod();  
} 

Вариант 4:

final Handler handler = new Handler(); 
volatile boolean flag = true; 

Class A implements Runnable{ 
    public void run(){ 
     // Do your Task 
    } 
    if(!flag) 
     handler.postDelayed(a, interval); 
} 

A a = new A(); 

handler.postDelayed(a); 

Там будет много больше возможностей. Я никогда не пробовал вариант 3 и 4. Это просто пришло мне в голову, и я написал. Если бы я был вами, я бы использовал любой из 1 или 2.

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