2013-03-14 52 views
3

我想运行一个线程(在后台执行一些耗时的任务,不更新UI),它只是从互联网上下载一些文件,并且它独立于用户界面。如何在间隔后重复运行线程

我想在一段时间间隔后重复运行此线程。

我怎样才能做到这一点,我有螺纹类似如下:

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); 
} 

它立即启动并且运行方法每秒被调用一次。

7

首选的选择是

java.util.concurrent.ScheduledExecutorService 

较新而强大的实施,这里更多ScheduledExecutorService

+1

迄今为止的最佳答案,应该接受答案;) – mana 2016-04-12 13:24:19

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中的任何一个。

相关问题