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

  • 我在其上放置了一个刷新菜单,如果用户尝试刷新内容,则将创建并启动下载线程。问题是,如何控制线程顺序,如果由于用户可能已更改了请求参数,还有一些其他请求仍在运行,则我需要接受最新请求的响应并放弃先前的线程请求。当前,我正在使用threadId来执行此操作,当线程完成时,它将检查其threadId,如果它是最新的recored,则它将控制并呈现响应。 我的问题是,还有其他合适的更好解决方案吗?
  • 用户退出应用程序时是否需要停止线程? 我记得有一本书说不要尝试手动停止线程并等待其本身完成是一种好习惯,是真的吗?我应该通过调用“停止”或“中断”方法来停止它们吗?
  • 我阅读了一些有关Android中线程的文档,并发现了类HandlerThread 类,这是什么?在哪种情况下我需要使用它?
  • 最佳答案

    与其为每个刷新 Action 启动一个新线程,不如为所有后台下载工作创建一个线程,该线程按队列排列并循环下载内容。这样可以确保您不会同时下载内容,也可以节省资源。

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

    要结束后台线程,您只需要结束其循环即可。您可以使用 Looper Handler 类来帮助您完成上述所有工作,您提到的HandlerThread类只是一个方便的类,用于创建具有 Looper 的线程。

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

    10-05 19:35
    查看更多