2012-08-28 40 views
2

我需要每10秒钟从Android服务器发送一些内容并采取措施。在这里,在StackOverflow以及文档中,我发现了数十种实现方法(以及我尝试过的所有工作都可以完成这项工作),但似乎在任何地方都有人说这种方式有问题。实施周期性操作的正确方法

我尝试了循环AsyncTask,直到它被取消(即直到活动被终止),我发现它不是一个好的解决方案。在此之前,我经常尝试Threads,然后我发现它耗尽了很多电池。

现在,我已经有一个Runnable,并与ScheduledExecutorService的的scheduleAtFixedRate功能做到了,相似的代码这里提出: How to run an async task for every x mins in android?。不用说,它可以工作。但是如果我的活动处于后台,例如用户是否正在接听来电,它会起作用吗?

最后,我不知道在Android手机上做什么是最合适的方式。

Tnx提前。

+1

任何周期性的,这期间会杀了,因为它永远不会让CPU(和系统)睡觉电池 –

回答

1

使用Handler它有各种方法,例如postDelayed(Runnable r, long delayMillis),postAtTime(Runnable r, Object token, long uptimeMillis)

Handler mHandler = new Handler() { 
    public void handleMessage(Message msg) { 

     //Start runnable here. 
    } 
    }; 

mHandler.sendMessageDelayed(msg, delayMillis) 
+0

是的,我试过了,但如果传输持续时间稍长,则会延迟UI。 –

+0

在您的handleMessage()中,您可以使用一个线程(在完成时向另一个消息发送另一个消息,其中UI可以更新)或者一个AsyncTask在后台运行该任务。 –

+0

尝试在handleMessage()内调用Asynctask。那么它不会落后于GUI。 –

1

建议你使用AlarmManagerBroadcastReceivers,如果你需要你的计划任务即使在您的应用程序当前未运行时也会发生。

否则,文档建议使用Handlers

正如在AmitD的问题的评论中所讨论的。如果任务需要在后台运行,则可以在处理程序回调中使用AsyncTask来实现此目的。

final Handler handler = new Handler() { 
    public void handlerMessage(Message msg) { 
    new AsyncTask<TaskParameterType,Integer,TaskResultType>() { 
     protected TaskResultType doInBackground(TaskParameterType... taskParameters) { 
     // Perform background task - runs asynchronously 
     } 
     protected void onProgressUpdate(Integer... progress) { 
     // update the UI with progress (in response to call to publishProgress()) 
     // - runs on UI thread 
     } 
     protected void onPostExecute(TaskResultType result) { 
     // update the UI with completion - runs on UI thread 
     } 
    }.execute(taskParameterObject); 
    } 
}; 
handler.postMessageDelayed(msg, delayMillis); 

对于重复执行该文档还提到ScheduledThreadPoolExecutor作为一个选项(其优于java.util.Timer,主要是由于额外的灵活性,它似乎)。

final Handler handler = new Handler() { 
    public void handlerMessage(Message msg) { 
    // update the UI - runs on the UI thread 
    } 
}; 
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1); 
ScheduledFuture f = exec.scheduleWithFixedDelay(new Runnable() { 
    public void run() { 
     // perform background task - runs on a background thread 
     handler.sendMessage(msg); // trigger UI update 
    } 
    }, 0, 10, TimeUnit.SECONDS); 
1

实现重复任务很大程度上是任务艰巨性/处理的一个功能。 UI会阻止你的任务吗?如果是这样,那么你可以用一个Handler和TimerTask来AsyncTask。

在你活动的onCreate或任何泛型函数:

final Handler handler = new Handler(); 
    timer = new Timer(); 
     doAsynchronousTask = new TimerTask() { 
      @Override 
      public void run() { 
      // TODO Auto-generated method stub 
      handler.post(new Runnable() { 
       public void run() { 
       try { 
       // Instantiate the AsyncTask here and call the execute method 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }); 
    timer.schedule(doAsynchronousTask,0,UPDATE_FREQUENCY) 
    }