在我的Android应用程序中,我使用线程从互联网上下载图像,但由于某些原因,当我在我的galaxy nexus上运行应用程序时会抛出networkonmainthread异常,但如果我在模拟器中运行应用程序则不会(测试Android)版本2.3.3和4.0.3)。
Thread ImageLoaderThread = new Thread(new Runnable() {
public void run() {
bitmap= DrawableManager.fetchDrawable(URL);
});
因为当我在启动时直接启动线程时GUI开始缓慢,我得到的印象是,线程确实在GUI线程上运行......但为什么???
答案 0 :(得分:0)
这取决于你的构建方式。在为设备构建时,您正在使用Honeycomb SDK(适用于Android 3.0及更高版本)进行构建。旧版SDK永远不会抛出NetworkOnMainThreadException
。
您没有为模拟器使用相同的SDK,至少在构建到2.3.3上进行测试时没有。如果在2.3.3和4.0.3上进行测试时使用相同的构建配置,那么这将完全解释您所看到的所有结果。
在主线程上访问网络从未被认为是良好的做法(关注的是UI响应,因为当您等待网络响应时,没有其他线程可以为UI提供服务),但是直到Honeycomb才对API进行严格禁止。
阅读此tutorial,将您的网络访问权转移到AsyncTask
。