Android操作和线程

时间:2013-03-30 20:51:31

标签: android multithreading android-asynctask httpclient

我正在编写和Android应用程序,我正在使用HttpClients和那些类。我花了2个小时试图修复一些错误,直到我读到一篇帖子说你不能在主线程中执行该操作。所以他们建议我使用AsyncTask。

所以我的问题是,我怎么知道应该在不同的线程中完成哪些操作?有一个列表,我可以阅读它们吗?

任何信息都会很好,提前谢谢。

5 个答案:

答案 0 :(得分:3)

当应用程序尝试在其主线程上执行网络操作时,抛出NetworkOnMainThreadException。仅针对Honeycomb SDK或更高版本的应用程序进行此操作。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行网络连接,但是非常不鼓励这样做。

ICS和HoneyComb不允许您在UI线程上执行的其他操作的一些示例是:

  1. 打开套接字连接(即新的套接字())。
  2. HTTP请求(即HTTPClient和HTTPUrlConnection)。
  3. 正在尝试连接到远程MySQL数据库。
  4. 下载文件(即Downloader.downloadFile())。
  5. 如果您尝试在UI线程上执行任何这些操作,则必须将它们包装在工作线程中。最简单的方法是使用AsyncTask,它允许您在用户界面上执行异步工作。 AsyncTask将在工作线程中执行阻塞操作,并将结果发布在UI线程上,而无需您自己处理线程和/或处理程序。

答案 1 :(得分:2)

网络异常是通过阻止UI-Thread在android中抛出的唯一异常。所以你必须通过在android中编程来记住3条规则。

不要让UI-Thread处理需要5秒钟才能完成的操作。

不要让广播接收器处理完成onReceive()需要20秒以上的操作。

不要在UI-Thread中处理网络操作。

答案 2 :(得分:1)

正如其他答案所说,Android不是线程安全的,意思是:

  • 您无法从后台线程操作UI
  • 你不能在UI线程上执行繁重的任务

此类其他操作可能包括处理大量数据/数据库操作/ HTTP请求/网络管理。真的,我相信任何不需要UI线程但确实需要大量处理时间的东西都应该移到一个单独的线程中。

这具有逻辑意义,因为如果您要进行繁重的处理,用户会感到滞后并且用户体验会受到损害(并且当然,肯定会用于使系统过载等)。因此,系统将杀死进程并在蜂窝后抛出错误。

因此,您希望使用异步任务。

Async Task实际上只是打开一个新的线程,您可以在其上执行繁重的处理或网络连接。对于网络连接,我建议使用以更简单的格式实现AsyncTask的AsyncClients like this one供您使用。还有像UniversalImageLoader这样的库,可以将图像加载到网格/列表中。

我也非常建议您阅读official Android documentation discussing this,并且还有一个有用的post on the Android blog。最后,我觉得好像this post可能对您有用,因为它可能包含您遇到的错误(错误,因为您在UI线程上执行了操作)。

我发现的其他资源:

总之,here is an example of an AsyncTask being used.(很好地回答了@Graham Smith的回答)。

答案 3 :(得分:0)

任何花费大量时间的事情都应该在另一个线程中完成。这包括大型IO和网络访问。但是我认为只有网络访问会抛出异常,其他任何东西都会导致无法响应的UI。虽然如果你走的时间过长,你会绊倒一个看门狗计时器,应用程序就会被杀死。

答案 4 :(得分:0)

正如加布所说,你应该在不同的线程中完成繁重的任务。

关于android线程有两个重要的事情。

1是常见的线程..(做你要求的线程)

2是ui线程...(监听用户反应并绘制ui的线程)

你只能通过ui线程改变ui(视图行为)。

另一方面,在蜂窝之后禁止在主线程中进行http请求。 (它被称为严格模式)

简而言之,任何阻止用户交互的操作都应该在另一个线程中完成。

我希望这会对你有所帮助。