在我的Android应用中,我通过在MyActivity
:
@Override
protected void onResume() {
super.onResume();
synchronized (this) {
if (!serviceDidStart) {
serviceDidStart = true;
Intent intent = new Intent(this, CustomService.class);
startService(intent);
}
}
@Override
protected void onPause() {
super.onPause();
Intent intent = new Intent(this, CustomService.class);
stopService(intent);
serviceDidStart = false;
}
然后在我的CustomService
:
private ScheduledExecutorService scheduler;
private scheduled = false;
private Runnable repeatingTask = new Runnable() {
@Override
public void run() {
System.out.println("Thread: " + Thread.currentThread().getId());
}
};
@Override
public void onCreate() {
scheduler = Executors.newSingleThreadScheduledExecutor();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (!scheduled) {
scheduler.scheduleWithFixedDelay(repeatingTask, 0, 5, TimeUnit.SECONDS);
scheduled = true;
}
return Service.START_STICKY;
}
我希望任务只在一个线程中安排和执行,这应该会产生如下输出:
线程:350
线程:350
线程:350
如果我在发布后没有做任何其他事情,那就没事了。但是,如果我按下主页按钮,然后恢复我的应用程序,输出和任务调度会变得如下:
线程:350
主题:362
线程:367
线程:350
主题:362
线程:367
我做错了什么吗?如果我想在应用程序的生命周期中仅在一个线程中安排并执行repeatingTask(即使在我暂停并恢复活动后仅使用一个线程进行调度和执行任务),我该怎么办呢?
我对Android和Java开发很新,我不知道在我的情况下出了什么问题。任何帮助和指导都会很棒,谢谢!
更新和修改
serviceDidStart = false;
的{{1}} MyActivity
答案 0 :(得分:0)
这是因为当你按下home时,会创建一个新的instacne并且旧的线程执行程序不会消失或停止。尝试根据您的需要在onDestroy
和var errors = '@Html.Raw(Json.Encode(ViewData.ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage)))';
var errorMessage=JSON.parse(errors);
中添加executor.shutdownnow或变体。