【问题标题】:Handler to increase count in AsnycTask on the background isn't delaying在后台增加 AsnycTask 计数的处理程序不会延迟
【发布时间】:2016-09-19 08:44:24
【问题描述】:

我正在尝试定期增加对后台的计数。

这是我在 AsyncTask 中的处理程序和 doInBackground 函数

protected Void doInBackground(Void... params) {
    while(true){
        handler.postDelayed(new Runnable() {




public void run() {

             count++;

            }
        }, 10000);

    }
}

当我执行这个任务时,它会等待 10 秒,然后它开始非常快速地增加计数(接近每秒 2k)。我想每 10 秒增加一次计数。

【问题讨论】:

  • 然后在 Handler 里面放一个 Thread.sleep ......你现在做的是等待 10 秒,然后运行一个 while true 循环

标签: android android-asynctask android-handler


【解决方案1】:

如果您想每 X 秒执行一次操作,可以使用处理程序。

private final static int INTERVAL = 10000;
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);
}

【讨论】:

  • 处理程序是否像 AsyncTask 一样在后台运行?我的意思是,如果我在主要活动中使用此代码,它不会开始循环并停止我的主要活动吗?
  • 不,处理程序在触发事件时不需要额外的线程来保持跟踪
【解决方案2】:

您的while(true) 循环导致了这种情况。您实际上是在另一个线程中创建一个新线程,从而取消了计时。您可以通过删除while(true) 并在run() 中调用doInBackground() 来解决此问题。这就是处理程序保持循环的方式。这是一个例子:

handler.postDelayed(new Runnable() {
    public void run() {
            count++;
            doInBackground("");
        }
    }, 10000);

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多