如何在Android中运行每个x分钟的asynchronous任务?
如何在特定的时间运行asynchronous任务? (我想每2分钟运行一次)
我尝试使用后,但它不工作?
tvData.postDelayed(new Runnable(){ @Override public void run() { readWebpage(); }}, 100);
在上面的代码中,readwebpage是为我调用asynchronous任务的函数。
下面是我正在使用的方法
public void onCreate(Bundle savedInstanceState) { readwebapage(); } public void readWebpage() { DownloadWebPageTask task = new DownloadWebPageTask(); task.execute("http://www.google.com"); } private class DownloadWebPageTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... urls) { String response1 = ""; response1=read(); //read is my another function which does the real work response1=read(); super.onPostExecute(response1); return response1; } protected void onPostExecute(String result) { try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } TextView tvData = (TextView) findViewById(R.id.TextView01); tvData.setText(result); DownloadWebPageTask task = new DownloadWebPageTask(); task.execute(new String[] { "http://www.google.com" }); } }
这是我的代码是什么,它工作得很好,但我的电池耗尽的大问题?
如果您想每隔X秒发起一次,您可以使用处理程序。 处理程序是好的,因为你不需要额外的线程来跟踪事件发生。 这是一个简短的片段:
private final static int INTERVAL = 1000 * 60 * 2; //2 minutes Handler mHandler = new Handler(); Runnable mHandlerTask = new Runnable() { @Override public void run() { doSomething(); mHandler.postDelayed(mHandlerTask, INTERVAL); } }; void startRepeatingTask() { mHandlerTask.run(); } void stopRepeatingTask() { mHandler.removeCallbacks(mHandlerTask); }
请注意, doSomething
不应该花费很长时间(比如UI中audio播放的更新位置)。 如果它可能需要一些时间(如下载或上传到networking),那么你应该使用ScheduledExecutorService
的scheduleWithFixedDelay
函数。
使用Handler
和PostDelayed
:
final Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() { readWebpage(); handler.postDelayed(this, 120000); //now is every 2 minutes } }, 120000); //Every 120000 ms (2 minutes)
您可以使用TimerTask而不是AsyncTask。
例如:
Timer myTimer = new Timer("MyTimer", true); myTimer.scheduleAtFixedRate(new MyTask(), ASAP, TWO_MINUTES); private class MyTask extends TimerTask { public void run(){ readWebPage(); } }
当手机进入睡眠模式,为了节省电量,并且在2分钟的时间内完全可能发生, Handler.postDelayed()
可能会错过预定的时间。 对于这样的活动,您应该使用AlarmManager
,使用PowerManager
locking以防止在运行AsyncTask时进入睡眠状态。
在这里看到我的post与代码示例
你也可能想阅读调度重复报警
尝试扩展Thread
类,设置2000毫秒的睡眠时间,并将您的调用放入run
方法。 这应该做到这一点。
你可以使用Time with Handler和TimeTask
final Handler handler = new Handler(); Timer timer = new Timer(); TimerTask backtask = new TimerTask() { @Override public void run() { handler.post(new Runnable() { public void run() { try { //To task in this. Can do network operation Also Log.d("check","Check Run" ); } catch (Exception e) { // TODO Auto-generated catch block } } }); } }; timer.schedule(backtask , 0, 20000); //execute in every 20000 ms*/
您可以使用'check'标签名来检查logcat是否正在运行
我build议去Handler#postDelayed(Runnable)
。 请记住, 只有当你的应用程序正在运行 (可能在后台),但是如果用户手动closures它,或者只是Android的内存不足,它将停止工作,以后不会再重新启动 – 为此,需要使用服务。
final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { handler.postDelayed(this, 2 * 60 * 1000); // every 2 minutes /* your code here */ } }, 2 * 60 * 1000); // first run after 2 minutes
此代码将等待2分钟,执行您的代码,然后每2分钟继续执行一次。 但是如果你想让它第一次立即运行 – 然后启动wait-do循环,请使用:
final Handler handler = new Handler(); /* your code here */ new Runnable() { @Override public void run() { handler.postDelayed(this, 2 * 60 * 1000); // every 2 minutes /* and also here - your code */ } }.run();
或者,如果你的代码长于一种方法(在这种情况下是readWebsite()
),你不希望被重复:
final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { handler.postDelayed(this, 2 * 60 * 1000); // every 2 minutes /* your longer code here */ } }, 0); // first run instantly
(^这个就像第一个例子,但是在第一次运行之前有一个0ms延迟,而不是2分钟)
(这个答案是基于@Devashish Mamgain的,但是我添加了太多的编辑细节,所以我不得不添加一个新的)
您可以在执行任务之间hibernate两秒的AsyncTask
中运行一个循环。 像这样的东西:
protected Result doInBackground (Params... params) { while (!interrupted) { doWork(); Thread.sleep(2000); } }