微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android:关机后,ExecutorService无法再次启动

如何解决Android:关机后,ExecutorService无法再次启动

我正在扩展Executorservice的类中创建Application的静态实例

  • MyApplication类
public class MyApplication extends Application {

    private static final int NUMBER_OF_THREADS = 4;
    public static ExecutorService databaseWriteExecutor = 
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
}

有2个活动使用的是executorservice,然后shutdown()

    用户启动的
  1. MainActivity在onDestroy()中执行shutdown()
    @Override
    protected void onDestroy() {
        super.onDestroy();

        // Wait for all tasks to complete then shutdown
        MyApplication.databaseWriteExecutor.shutdown();
    }

(没问题,我可以在关闭并重新打开应用后使用MyApplication.databaseWriteExecutor

  1. AlarmTriggerActivity:由AlarmManager启动(此时应用未运行),用户可以通过按钮关闭闹钟(停止相关服务并调用finish())

这里也一样... onDestroy()中的shutdown()执行程序服务 现在,如果我再次打开应用程序(MainActivity)并执行任何使用executorservice的操作,则应用程序将异常崩溃

E AndroidRuntime: Process: com.pk.alarmclock,PID: 25354
E AndroidRuntime: java.util.concurrent.RejectedExecutionException:
  Task com.pk.alarmclock.alarm.db.AlarmRepository$4@b99c8c4 rejected from java.util.concurrent.ThreadPoolExecutor@73e63ad[Terminated,pool size = 0,active threads = 0,queued tasks = 0,completed tasks = 0]

如果我在重新打开应用程序后在MainActivity的onCreate()中检查if(MyApplication.databaseWriteExecutor.isShutdown()),它也会返回true

我不明白为什么在从AlarmTriggerActivity中执行shutdown()后不重新执行执行器服务,但是如果通过MainActivity中的shutdown()也可以使用同样的方法

解决方法

我发现在AlarmTriggerActivity上调用finish()之后,应用程序进程仍然存在。因为MyApplication在重新打开应用程序和{{1}的相同实例时没有再次启动}(曾经是ExecutorService

作为临时解决方案,我在shutdown()中未使用shutdown() 并且仅在肯定会因从最近用户/系统中滑动而杀死应用的AlarmTriggerActivty中使用它(因此,在创建MainActivity时会创建ExecutorService的新实例)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。