我正在编写和Android应用程序,我正在使用HttpClients和那些类。我花了2个小时试图修复一些错误,直到我读到一篇帖子说你不能在主线程中执行该操作。所以他们建议我使用AsyncTask。
所以我的问题是,我怎么知道应该在不同的线程中完成哪些操作?有一个列表,我可以阅读它们吗?
任何信息都会很好,提前谢谢。
答案 0 :(得分:3)
当应用程序尝试在其主线程上执行网络操作时,抛出NetworkOnMainThreadException
。仅针对Honeycomb SDK或更高版本的应用程序进行此操作。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行网络连接,但是非常不鼓励这样做。
ICS和HoneyComb不允许您在UI线程上执行的其他操作的一些示例是:
如果您尝试在UI线程上执行任何这些操作,则必须将它们包装在工作线程中。最简单的方法是使用AsyncTask
,它允许您在用户界面上执行异步工作。 AsyncTask
将在工作线程中执行阻塞操作,并将结果发布在UI线程上,而无需您自己处理线程和/或处理程序。
答案 1 :(得分:2)
网络异常是通过阻止UI-Thread在android中抛出的唯一异常。所以你必须通过在android中编程来记住3条规则。
不要让UI-Thread处理需要5秒钟才能完成的操作。
不要让广播接收器处理完成onReceive()需要20秒以上的操作。
不要在UI-Thread中处理网络操作。
答案 2 :(得分:1)
正如其他答案所说,Android不是线程安全的,意思是:
此类其他操作可能包括处理大量数据/数据库操作/ 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请求。 (它被称为严格模式)简而言之,任何阻止用户交互的操作都应该在另一个线程中完成。
我希望这会对你有所帮助。