【问题标题】:Calling asynctask from runnable从 runnable 调用 asynctask
【发布时间】:2011-05-16 05:44:29
【问题描述】:

是否可以从 Runnable 执行 AsyncTask?根据我的经验,它可以完成,但并不安全。当我的应用程序第一次运行时,我的 AsyncTask 从 Runnable 运行良好。但是,当应用程序移到后台,然后带回来我得到“无法在未调用 Looper.prepare() 的线程内创建处理程序”。

这就是我想要做的事情: 我正在使用 MapView 并在 onCreate 中调用 runOnFirstFix(Runnable)。我的 Runnable 调用 AsyncTask 来执行 Web 服务调用,该调用会根据位置返回一些数据。 我将应用程序移至后台(通过点击主页按钮),一段时间后,我再次将应用程序向前移动,并且在我的 AsyncTask 上调用 execute() 时出现异常。

首先,为什么runOnFirstFix又被执行了?其次,为什么它会导致第二次异常? 我猜我不明白生命周期的某些部分。

谢谢。

【问题讨论】:

  • 为什么要将AsyncTask 调用封装成Runnable?无论如何,它的doInBackground 方法在后台线程中运行,在onPre-onPostExecute 中,您可以操作您在UI 线程上声明的gui 和其他内容。另一方面,当您将应用程序置于前台时,您的 onCreate 方法会被调用,这就是 runOnFirstFix 再次运行的原因。
  • 我正在尝试重用现有的 AsyncTask,但我想我可以将该逻辑直接移动到 Runnable 中。至于第二次调用 runOnFirstFix 我不相信它是(直接)因为你所说的原因,而是因为我在 onCreate() 中实例化 MyLocationOverlay 的一个新实例

标签: android android-mapview android-asynctask runnable


【解决方案1】:

最初对我来说,需要从 UI 线程调用 AsyncTask 并不明显。因此,当 runOnFirstFix 第二次运行时,它来自一个不在 UI 线程上的 Runnable。为了解决这个问题,我简单地在第一个运行 AsynchTask 的内部创建了另一个 Runnable。

我的 runOnFirstFix 似乎被调用了两次的原因仅仅是因为我正在创建它的一个新实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 2013-09-29
    • 1970-01-01
    • 2013-07-02
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多