Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中每x分钟运行一次异步任务?_Android_Android Asynctask - Fatal编程技术网

如何在android中每x分钟运行一次异步任务?

如何在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

如何在特定时间运行异步任务?(我想每2分钟运行一次)

我试过使用延迟的post,但它不起作用

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