【问题标题】:Android: ExecutorService is not starting again after shutdownAndroid:ExecutorService 关机后没有再次启动
【发布时间】:2020-10-19 05:44:49
【问题描述】:

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

  • MyApplication 类
public class MyApplication extends Application {

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

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

  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 关闭()后没有重新初始化,但如果从 MainActivity 关闭(),同样的事情

【问题讨论】:

    标签: android database android-room executorservice


    【解决方案1】:

    我发现在AlarmTriggerActivity 上调用finish() 后,应用程序进程仍然存在。因此,MyApplication 在重新打开应用程序时没有再次启动,并且使用了相同的ExecutorService 实例(这是shutdown())

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-19
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多