【问题标题】:runOnUiThread() acts on a closed activity when called from ThreadExecutor当从 ThreadExecutor 调用时,runOnUiThread() 作用于关闭的活动
【发布时间】:2020-09-15 00:58:26
【问题描述】:

runOnUiThread() 处理已关闭的活动时遇到问题。逻辑如下:

在活动一中,我导航到活动二。

在活动二中,我正在做一些后台抓取,完成后,我导航到活动三。

问题是,如果我在仍在获取数据的同时关闭活动二,我的线程会继续运行,并且由于在我的代码中调用了 runOnUiThread(),活动一会得到执行,它会将我导航到活动三。我不希望这种情况发生。我希望线程停止,或者至少让runOnUiThread() 中的内容不触及除创建线程的活动之外的任何其他活动。

注意:在我的示例中,它正在启动一个活动,但其他代码可能与以相同方式触发的 UI 相关。

我的代码如下所示:

ExecutorService executorService = Executors.newSingleThreadExecutor();

executorService.execute(new Runnable() {
    public void run() {
        // Do fetching of data

    runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // Navigate to activity three
            }
        });
    }
});

我尝试在活动关闭时关闭执行器服务,虽然我可以验证 onDestroy() 是否被 console.log 语句调用,但它似乎既不是shutdown() 也不是shutdownNow() 工作:

@Override
protected void onDestroy() {
    super.onDestroy();

    if (executorService != null) {
        executorService.shutdown(); // Does not work to stop thread from executing
        executorService.shutdownNow(); // Does not work to stop thread from executing
    }

}

编辑:如何添加中断器以中断线程?

【问题讨论】:

标签: java android runnable


【解决方案1】:

您必须在 Runnable 类中添加对 ExecutorService.isShutdown() 的检查。 ExecutorService.shutdown()ExecutorService.shutdownNow() 不保证之前提交的任务会立即关闭。

根据文档,

ExecutorService.shutdown()

启动有序关闭,其中先前提交的任务被 执行,但不会接受新任务。调用没有 如果已经关闭,则附加效果。 该方法不等待之前提交的任务完成执行。

ExecutorService.shutdownNow()

尝试停止所有正在执行的任务,停止处理 等待任务,并返回正在等待的任务列表 执行。

此方法不会等待主动执行的任务终止。

除了尽力停止处理之外,没有任何保证 积极执行任务。例如,典型的实现将 通过 Thread.interrupt() 取消,因此任何无法响应的任务 中断可能永远不会终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多