如何在特定时间运行异步任务? (我想每隔2分钟运行一次)
我尝试使用延迟发布但不起作用?
tvData.postDelayed(new Runnable(){
@Override
public void run() {
readWebpage();
}}, 100);
在上面的代码中,readwebpage是为我调用异步任务的函数..
现在,下面是我正在使用的方法
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" });
}
}
这就是我的代码,它的工作原理非常好,但是我的电池耗尽了大问题?
答案 0 :(得分:67)
如果您想每隔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中音频播放的更新位置)。如果可能需要一些时间(例如下载或上传到网络),那么您应该使用ScheduledExecutorService
的scheduleWithFixedDelay
功能。
答案 1 :(得分:29)
使用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)
答案 2 :(得分:7)
您可以使用TimerTask而不是AsyncTask。
例如:
Timer myTimer = new Timer("MyTimer", true);
myTimer.scheduleAtFixedRate(new MyTask(), ASAP, TWO_MINUTES);
private class MyTask extends TimerTask {
public void run(){
readWebPage();
}
}
答案 3 :(得分:1)
当手机进入睡眠模式时,为了节省电量,并且很可能在2分钟的间隔内发生,Handler.postDelayed()
可能会错过预定的时间。对于此类活动,您应该使用AlarmManager
,锁定PowerManager
以防止在运行AsyncTask时进入睡眠状态。
请参阅我的帖子,其中包含代码示例here
答案 4 :(得分:1)
我建议使用Handler#postDelayed(Runnable)
。请注意,此方法仅适用于您的应用正在运行(可能在后台),但如果用户手动关闭它,或者只是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的答案,但我为编辑添加了太多细节,所以我不得不添加一个新的)
答案 5 :(得分:0)
尝试扩展Thread
课程,将睡眠时间设置为2000毫秒,然后将调用放入run
方法。应该这样做。
答案 6 :(得分:0)
您可以使用Time with Handler和TimerTask
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*/
您可以使用&#39;检查&#39;检查logcat以验证是否正在运行标签名称
答案 7 :(得分:0)
执行多个消息(Runnables)然后他应该使用负责在线程中创建队列的Looper类。例如,在编写从Internet下载文件的应用程序时,我们可以使用Looper类将要下载的文件放入队列中。这将帮助您在Android中执行异步任务...
HandlerThread hThread = new HandlerThread("HandlerThread");
hThread.start();
Handler handler = new Handler(hThread.getLooper());
final Handler handler1 = new Handler(hThread.getLooper());
final long oneMinuteMs = 60 * 1000;
Runnable eachMinute = new Runnable() {
@Override
public void run() {
Log.d(TAG, "Each minute task executing");
handler1.postDelayed(this, oneMinuteMs);
sendPostRequest();
}
};
// sendPostRequest();
// Schedule the first execution
handler1.postDelayed(eachMinute, oneMinuteMs);
答案 8 :(得分:-13)
您可以在AsyncTask
内运行一个循环,在执行任务之间休眠两秒钟。像这样:
protected Result doInBackground (Params... params) {
while (!interrupted) {
doWork();
Thread.sleep(2000);
}
}