Android中的线程处理

9

我目前正在开发Android应用程序,它需要从互联网下载内容。我使用线程来完成这个任务,然后调用runOnUiThread方法来更新GUI。

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

1
这篇博客文章可能会有所帮助:http://foo.jasonhudgins.com/2010/02/rebel-without-context.html 博客文章中的一个很好的想法是,让您的活动为下载完成的“事件”注册/注销侦听器,以便您的服务可以触发这些事件来更新用户界面。 - Roman Nurik
3个回答

4
与其为每个刷新操作启动一个新线程,我会创建一个单一的线程来处理所有后台下载工作,该线程循环并按队列中排列的内容下载。这确保您不会同时下载内容,并节省资源。
在GUI中,只需在用户提示时排队刷新请求,并可以通过调用http方法实例上的HttpRequestBase.abort来中止正在运行的下载。后台线程应接收并捕获SocketException,然后继续进行下一个排队请求。
要结束后台线程,只需结束其循环即可。您可以使用LooperHandler类来帮助您完成以上所有操作,您提到的HandlerThread类只是一个方便的类,用于创建具有Looper的线程。

interrupt线程的问题在于它无法打破阻塞的I/O请求,而正确地处理InterruptException可能会很复杂。因此,根据情况,我会说是更好的实践方法是通过从run方法返回来结束线程。


如果我使用looper创建了一个线程,我猜它可以按照队列中的顺序执行我的请求,那么如果有新的请求进来,我该如何取消之前的请求呢?因为我只需要最新的结果。 - virsir
你可以将你的 HttpGet 引用可用并调用它的 abort 方法。或者你没有使用 HttpClient 吗? - Josef Pfleger

2

本周我发现了AsyncTask,我在程序中的一些地方将Thread替换为AsyncTask,
你可以在这里找到文档和示例,非常容易使用:
http://developer.android.com/reference/android/os/AsyncTask.html
当我使用Thread时,GUI被锁定,现在它没有被锁定。
并且可以取消AsyncTask(但我从未尝试过)。


1
你可以使用IntentService来启动后台操作,该服务将作为“工作队列处理器”,以顺序执行你的调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接