Android中的线程

时间:2010-06-13 06:11:54

标签: java android multithreading

我目前正在开发Android应用,它需要从互联网下载内容。我使用线程来执行该操作,然后调用runOnUiThread方法来更新GUI。

  1. 我在其上放置了一个刷新菜单,如果用户尝试刷新内容,则会创建并启动下载线程。问题是我如何控制线程顺序,我需要接受最新请求的响应并放弃先前的线程请求,如果还有其他请求仍在运行,因为请求参数可能已被用户更改。目前我正在使用threadId来做这件事,当一个线程完成时,它会检查它的threadId,如果它是最新的一个,它然后接受控制并呈现响应。 我的问题是,还有其他更合适的解决方案吗?
  2. 用户退出应用程序时是否需要停止线程?我记得有些书说不要手动尝试停止线程并等待自己完成是一个好习惯,是真的吗?我应该通过调用“停止”或“中断”方法来阻止它们吗?
  3. 我在Android中阅读了一些围绕线程的文档并找到了类 HandlerThread ,这是什么?在什么样的情况下我需要使用它?

3 个答案:

答案 0 :(得分:4)

不是为每个刷新操作启动一个新线程,而是为所有后台下载工作创建一个单独的线程,循环和下载队列中排列的内容。这可确保您不会同时下载内容并节省资源。

在GUI中,您只需在用户提示时排队刷新请求,并可以通过调用http方法实例上的HttpRequestBase.abort来中止正在运行的下载。后台线程应该接收并捕获SocketException并继续下一个排队请求。

要结束后台线程,您只需结束其循环。您可以使用LooperHandler类来帮助您完成上述所有操作,您提到的HandlerThread类只是一个方便的类来创建一个{{3}的线程}。

interrupt线程的问题在于它不会让您摆脱阻塞的I / O请求,并且正确处理InterruptException可能会很复杂。所以根据情况,我会说是,最好通过从run方法返回来结束线程。

答案 1 :(得分:2)

我发现本周的AsyncTask,我在程序的某个地方用AsyncTask替换了Thread,
你有doc&样品在这里,真的很容易使用:
http://developer.android.com/reference/android/os/AsyncTask.html
当我使用线程GUI时锁定,现在它没有锁定。
并且可以取消AsyncTask(但我从不尝试)

答案 2 :(得分:1)

您可以使用IntentService开始后台操作,该服务将作为“工作队列处理器”运行,并将按顺序执行您的呼叫。