我正在使用通知侦听器服务收听通知,以收听Google导航通知。在删除通知我想等待n秒然后执行一些任务。为了达到这个目的,我在服务中做了一个AsyncTask,我已经使用Thread.sleep来休眠后台线程n秒,然后执行一些任务。
但是这个睡眠正在影响我从前台服务运行的其他后台线程,由于上面提到的异步任务,所有这些后台线程也会被延迟。
我还尝试在通知侦听器服务中使用Handler.postDelayed方法在n秒后执行任务,但它从不运行。
请建议任何更好的方法来实现这一目标。
答案 0 :(得分:2)
Thread.sleep()
将暂停在同一默认线程池上运行的所有其他AsyncTasks
,而不是Threads
。
默认情况下,在Android中,所有AsyncTasks
都会在一个默认ThreadPool
上执行,其中Thread
为Executor
。这样它们在后台逐个执行。
因此,您可以定义要在其上执行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