【问题标题】:Android App crashes after calling finish调用完成后Android App崩溃
【发布时间】:2017-09-22 21:43:41
【问题描述】:

根据我的理解,这是我预计不会发生的事情。

在我的应用程序中,我执行()一个 AsyncTask 可能需要不到 2-3 秒的时间。在那个 AsyncTask 中,我运行了 runOnUiThread(),它更新了一些 UI 控件的值。

这工作正常,直到,如果我点击退出按钮,它会完成 Activity。

我得到空指针异常,findViewById 返回空值。我可以在更新之前添加空检查,但考虑到使用的 UI 屏幕和 AsyncTasks 的数量,我最终会进行大量检查。

为什么调用finish()后UI线程还在执行中?

这种情况的最佳解决方案是什么? 仅当 AsyncTask 完成和调用 finish() 之间的时间差完全一致时才会出现问题。

问候,

哈沙

【问题讨论】:

  • 丹尼尔,这些门票中的信息似乎值得一试。我正在从不同的角度进行搜索。
  • 丹尼尔,我还有一个后续问题。由于 runOnUiThread() 内的代码中出现问题,如果主线程(UI 线程)由于 finish() 而被 OS 取消,runOnUiThread() 试图寻找 UI 线程时会有任何异常吗?我不确定我该如何准确地测试它来验证。
  • @harshal 当你的 asyncTask 寻找一个它找不到的视图时自然会抛出一个 NullPointerException (因为你的活动已经完成,因此你的 UI 元素已经消失了)

标签: android android-asynctask


【解决方案1】:

AsyncTask 在后台运行,直到它正在执行的作业完成,因此对当前活动调用“完成”不会杀死它。 正如您所说,添加空检查会很麻烦,所以我要做的是在调用 finish() 之前取消 asyncTask。

if (asyncTaskInstatnce != null && !a.isCancelled())
     a.cancel(true);

【讨论】:

    【解决方案2】:

    您使用 AysncTask 的 onPostExecute 方法来更新 UI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2020-08-20
      相关资源
      最近更新 更多