【问题标题】:Async Task and Handlers Android异步任务和处理程序 Android
【发布时间】:2013-07-03 19:30:51
【问题描述】:

我有一段代码 list = geocoder.getFromLocation( locationNetwork.getLatitude(), locationNetwork.getLongitude(), 3); 我试图通过getFromLocation(LocationManager)检索最后一个位置。由于这可能需要时间,我想将它放在与 UI 不同的线程上。但我很困惑应该使用什么。是否应该为此目的使用处理程序或异步任务。我很困惑何时应该在 Android 中使用处理程序和异步任务。任何人都可以用一些例子来解释我,场景.. 谢谢!

【问题讨论】:

  • 它只需要一个简单的线程,你需要在一个单独的方法中调用geocoder.getFromLocation()方法,在另一个方法中处理UI this tutorial会帮助你

标签: android android-asynctask locationmanager android-handler


【解决方案1】:

我认为你在这里搞混了。处理程序和异步任务是两个不同的东西。处理程序用于在线程之间进行通信,see here,而 Async 任务基本上是 Android 中更易于使用的线程。如果你创建一个新线程并想与另一个线程通信,你必须使用 Handler。但是,Google 通过提供 Async 任务类使其更容易,该类允许在不使用处理程序的情况下与主 UI 线程进行通信,see here。因此,简而言之,为您的目的使用异步任务。我提供的链接实际上提供了一个示例用法,并深入了解了 Asyncs。如果您需要澄清,请告诉我。

【讨论】:

  • 我们不是也使用异步任务与 UI 通信吗?
  • Asynctasks 有一个你必须实现的名为 onPostExecute 的方法。此方法在异步任务完成后在主 UI 线程上运行。这样,您想与主线程进行的任何类型的通信都可以在此方法中完成。这比使用 Handler 将消息发送回主 UI 线程要容易得多。
【解决方案2】:

See this SO answer讲了AsyncTaskHandlerThread的区别

如果您正在谈论创建Thread,大多数时候这是开发人员的偏好。如果您需要更新UI,尤其是在后台Thread 运行时,那么我认为AsyncTask 更容易。它们都允许您继续使用UI,同时它们在后台进行更重的提升。

您可以使用AsyncTask 并在doInBackground() 中进行工作,然后在任何其他AsyncTask 方法上更新UI。如果您可能想在多个地方使用此Thread,请将其设为单独的文件,如果需要,您可以通过其构造函数将Activity Context 传递给它。如果您只在一个Activity 中使用它,那么您可以将其设置为您的Activity 的内部类,那么它将可以访问该Activity 的所有成员变量

【讨论】:

  • 我得到了异步任务的工作。我只是很困惑,因为我们什么时候可以在异步任务上使用处理程序......
  • 你可以使用任何一个。我只是更喜欢AsyncTask
  • @user2511882 当调用者线程是 UI 线程时使用 AsyncTask。在其他地方使用处理程序。
  • 如果您创建自己的工作线程,那么您必须使用 Handler 与您的主(UI)线程进行通信。对于 AsyncTasks,onPreExecute()/onPostExecute() 方法为您完成这项工作。
  • 好的..谁能给我一个使用处理程序更好的例子