如何在android中每x分钟运行一次异步任务?
如何在特定时间运行异步任务?(我想每2分钟运行一次) 我试过使用延迟的post,但它不起作用如何在android中每x分钟运行一次异步任务?,android,android-asynctask,Android,Android Asynctask,如何在特定时间运行异步任务?(我想每2分钟运行一次) 我试过使用延迟的post,但它不起作用 tvData.postDelayed(new Runnable(){ @Override public void run() { readWebpage(); }}, 100); 在上面的代码中,readwebpage是为我调用异步任务的函数 下面是我正在使用的方法 public void onCreate(Bundle savedInstan
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" });
}
}
public void onCreate(Bundle savedInstanceState){
readwebapage();
}
公开阅读网页(){
DownloadWebPagetTask=新建DownloadWebPagetTask();
任务。执行(“http://www.google.com");
}
私有类下载WebPagetTask扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…URL){
字符串响应1=“”;
response1=read();
//阅读是我的另一个真正工作的功能
response1=read();
super.onPostExecute(response1);
返回响应1;
}
受保护的void onPostExecute(字符串结果){
试一试{
睡眠(100);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
TextView tvData=(TextView)findViewById(R.id.TextView01);
tvData.setText(结果);
DownloadWebPagetTask=新建DownloadWebPagetTask();
task.execute(新字符串[]{”http://www.google.com" });
}
}
这就是我的代码,它工作得很好,但最大的问题是我耗尽了电池?如果你想每X秒启动一次,你可以使用handler。处理程序很好,因为在触发事件时不需要额外的线程来保持跟踪。以下是一个简短的片段:
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中音频播放的位置)。如果可能需要一些时间(如下载或上传到web),则应使用的scheduleWithFixedDelay
函数。尝试扩展线程
类,将睡眠时间设置为2000毫秒,并将呼叫放入运行
方法。应该可以了。您可以在AsyncTask
中运行一个循环,在执行任务之间休眠两秒钟。大概是这样的:
protected Result doInBackground (Params... params) {
while (!interrupted) {
doWork();
Thread.sleep(2000);
}
}
使用
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 例:
当手机进入睡眠模式时,为了节省电池电量,很可能会在2分钟内发生,
Handler.postDelayed()
可能会错过预定时间。对于此类活动,您应该使用AlarmManager
,使用PowerManager
锁定,以防止在运行异步任务时返回睡眠状态
请参阅我的文章和代码示例
另外,您可能需要阅读您可以将时间与处理程序和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*/
您可以使用“检查”标记名来检查logcat是否正在运行我建议使用
处理程序#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
(^此示例与第一个示例类似,但在首次运行之前延迟0毫秒,而不是2分钟)
(此答案基于@Devashish Mamgain的答案,但我为编辑添加了太多细节,因此我必须添加一个新的答案)执行多条消息(可运行),然后他应该使用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);
“我试过使用post delayed,但它不起作用?”-这不能解释任何问题。如果没有更多的代码和logcat输出来显示异常,回答您的问题就不容易了。@MisterSquonk发布了我的全部代码。当然,这会耗尽您的电池电量。您正在获取Web内容,休眠100毫秒,然后再次获取它。这对你的电池不好,而且当你收到手机账单时可能会非常昂贵。以下方法都不起作用我该怎么办?我想每2分钟或5分钟获取一次网络内容。请注意,
postDelayed()
也是查看
的一种方法,因此如果你身边有一个小部件,您不需要处理程序。这不会每2分钟运行一次。它在2分钟延迟后运行一次。在无限循环中运行doInBackground()确实是个坏主意。理想情况下,使用AsyncTask应该是一次性操作,并且不应该运行很长时间;120000ms=2分钟。实际上,在您提交更改之前,我已经解决了:)是否为m_handlerTask.run()?我不理解您的问题。你能详细说明一下吗?void startRepeatingTask(){m_handleTask.run();}这是否正确?当我在eclipse中发布代码时,它显示了一个错误?这段代码应该在onCreate中,对吗?我现在正在使用服务:)这个问题是5年前的:)
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);