Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 奇怪的networkonmainthread异常:仅在galaxy nexus上,不在模拟器中_Android_Multithreading_User Interface_Networking - Fatal编程技术网

Android 奇怪的networkonmainthread异常:仅在galaxy nexus上,不在模拟器中

Android 奇怪的networkonmainthread异常:仅在galaxy nexus上,不在模拟器中,android,multithreading,user-interface,networking,Android,Multithreading,User Interface,Networking,在我的Android应用程序中,我使用线程从互联网下载图像,但由于某种原因,当我在galaxy nexus上运行应用程序时,会引发networkonmainthread异常,但如果我在emulator中运行应用程序,则不会引发异常(已测试的Android版本2.3.3和4.0.3) 因为当我在启动时直接启动线程时,GUI启动缓慢,我得到的印象是,线程确实在GUI线程上运行……但是为什么呢?这取决于您如何构建。在为设备构建时,您正在使用(Android 3.0及更高版本)构建NetworkOnMa

在我的Android应用程序中,我使用线程从互联网下载图像,但由于某种原因,当我在galaxy nexus上运行应用程序时,会引发networkonmainthread异常,但如果我在emulator中运行应用程序,则不会引发异常(已测试的Android版本2.3.3和4.0.3)


因为当我在启动时直接启动线程时,GUI启动缓慢,我得到的印象是,线程确实在GUI线程上运行……但是为什么呢?

这取决于您如何构建。在为设备构建时,您正在使用(Android 3.0及更高版本)构建
NetworkOnMainThreadException
从不与旧SDK一起引发

您没有为模拟器使用相同的SDK,至少在构建以在2.3.3上测试时没有。如果在2.3.3和4.0.3上进行测试时使用相同的构建配置,这将完全解释您看到的所有结果

在主线程上访问网络从未被视为良好实践(问题在于UI响应性,因为当您等待网络响应时,没有其他线程可以为UI提供服务),但直到Honeycom之前,API中并没有严格禁止这种做法


阅读本文,将您的网络访问移动到
异步任务中

,加载内容所需的时间应该无关紧要;您的线程将从您设置的开始位置开始(它不能从一个父线程跳到另一个父线程)。它是在模拟器上100%工作还是只是没有崩溃?谢谢你的回复!是的,它在模拟器上完全工作,下载的图像会显示出来。使用该线程启动比不使用该线程启动要长几秒钟,因此我非常确定GUI线程参与下载。您可以随时让新线程等待。听起来好像下载发生在UI线程准备就绪之前,导致应用程序崩溃。在UI线程可用后尝试启动线程。即使我这样做,例如,仅在按下按钮后启动线程,它仍会引发networkonmainthread异常。好的,谢谢,我现在使用AsyncTask,但我仍然想知道为什么我创建的线程会引发异常。我认为创建线程的关键在于它不在GUI线程上运行。@user1406731-但是你需要启动你的线程,这意味着直接调用它的
start
方法。如果只从主线程直接调用
run
方法,那么其中的代码仍然在调用线程上运行(没有启动新线程);切勿直接调用
run
Thread ImageLoaderThread = new Thread(new Runnable() {
public void run() {

 bitmap= DrawableManager.fetchDrawable(URL);

 });