AsyncTask中的Thread.sleep()会睡眠其他后台线程

时间:2018-01-30 09:07:50

标签: android multithreading android-asynctask sleep

我正在使用通知侦听器服务收听通知,以收听Google导航通知。在删除通知我想等待n秒然后执行一些任务。为了达到这个目的,我在服务中做了一个AsyncTask,我已经使用Thread.sleep来休眠后台线程n秒,然后执行一些任务。

但是这个睡眠正在影响我从前台服务运行的其他后台线程,由于上面提到的异步任务,所有这些后台线程也会被延迟。

我还尝试在通知侦听器服务中使用Handler.postDelayed方法在n秒后执行任务,但它从不运行。

请建议任何更好的方法来实现这一目标。

3 个答案:

答案 0 :(得分:2)

Thread.sleep()将暂停在同一默认线程池上运行的所有其他AsyncTasks,而不是Threads

默认情况下,在Android中,所有AsyncTasks都会在一个默认ThreadPool上执行,其中ThreadExecutor。这样它们在后台逐个执行。

因此,您可以定义要在其上执行AsyncTask的自定义或预定义task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

# install.packages(c("tidyverse"), dependencies = TRUE)
library(dplyr)
mydata %>% mutate(y2 = (y -min(y))* 100/(max(y)- min(y))) %>%  
   ggplot(aes(x = x, y = y2)) + 
        geom_point(shape = 21,size = 5,color = "black",fill = "orange",stroke = 1) + 
        scale_x_continuous(name = 'Number of Contacts') + 
        scale_y_continuous(name="Remembered (%)", 
     sec.axis = sec_axis(trans = ~. +10,name = "Remembered (Index)"))

答案 1 :(得分:0)

而不是直接从通知中删除函数回调执行AsyncTask。所以一个很好的选择是Handler.postDelayed()

在Notification侦听器的服务类中定义处理程序和runnable。

class NotificationListener extends NotificationListenerService {
    ...
    class PerformTask extends AsyncTask<Void, Void, Void> {
      ...
    }

    private Handler handler = new Handler();
    private Runnable runnable = new Runnable() {
        PerformTask object = new PerformTask();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
            object.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        else
            object.execute();
    };
    ...
}

并在通知删除部分

所需的时间范围后延迟执行
@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
    ...
    handler.postDelayed(runnable, 5000);
    ...
}

答案 2 :(得分:-1)

如果在同一个线程池上运行,

sleep线程(Asynctask)将暂停所有其他Async。 https://developer.android.com/training/multiple-threads/run-code.html