android.os.NetworkOnMainThreadException异常

最近好忙啊,准备完比赛的东西就准备驾考,终于可以稍微歇息下了,好久没写了。今天解决了一个对之前的我来说是一个很大的问题,好开心呀!!

之前项目开发是用2.3开发 测试手机是android4.4时候提示 android.os.NetworkOnMainThreadException异常

第一次看到这异常,字面意思是说:在主线程中的网络异常。然后我就去了解了下这个异常,先看看官方的说明:

public class

NetworkOnMainThreadException

extends RuntimeException

java.lang.Object
? java.lang.Throwable
? java.lang.Exception
? java.lang.RuntimeException
? android.os.NetworkOnMainThreadException

Class Overview



The exception that is thrown when an application attempts to perform a networking operation on its main thread.

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it‘s heavily
discouraged. See the document Designing for Responsiveness.

Also see StrictMode.

所以事情就很清楚了。一个APP如果在主线程中请求网络操作,将会抛出此异常。Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。android在4.0之前的版本 支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中了。

解决方案有两个,一个是使用StrictMode,二是使用线程来操作网络请求。

第一种解决办法是在oncreate()中添加:

int currentapiVersion=android.os.Build.VERSION.SDK_INT;    //获取当前系统版本

if (currentapiVersion> 9) {

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()

.detectDiskReads().detectDiskWrites().detectNetwork()

.penaltyLog().build());

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()

.detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()

.build());

}

但是要注意StrictMode是2.3以上版本才有的

第二种方法 也就是多线程,异步加载的方式加载数据。在Runnable中做HTTP请求,不用阻塞UI线程。

// 定义Handler对象

final Handler handler = new Handler() {

@Override

// 当有消息发送出来的时候就执行Handler的这个方法

public void handleMessage(Message msg) {

super.handleMessage(msg);

// 处理UI

}

};

new Thread() {

@Override

public void run() {

// 你要执行的方法

// 执行完毕后给handler发送一个空消息

handler.sendEmptyMessage(0);

}

}.start();

或:

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

new Thread(connectRunnable).start(); // Create a connect.

}

Runnable connectRunnable = new Runnable() {

@Override

public void run() {

}

};

我只试了第一种方法,但是不推荐使用,建议用第二种方法。

时间: 2024-10-25 19:38:07

android.os.NetworkOnMainThreadException异常的相关文章

安卓开发解决android.os.NetworkOnMainThreadException异常方法(主线程不能直接调用webservice)

安卓开发解决android.os.NetworkOnMainThreadException异常方法 2013-01-07 14:01:04|  分类: 技术 |  标签:安卓  技术  java  |举报|字号 订阅 在android 2.3上访问网络的方法,在android 4.0上运行时报android.os.NetworkOnMainThreadException异常,主要问题在于4.0中访问网络不能在主线程中进行,有两个方法可以解决.第一种是在主线程中增加如下代码[不推荐]: // 详见

android之android.os.NetworkOnMainThreadException异常

使用android测试访问web服务器的webservice时,在MainActivity的主线程中访问webservice,代码如下: package com.example.myandroidpro; import java.io.File; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationE

Android Eclipse工程开发中的常见调试问题(二)android.os.NetworkOnMainThreadException 异常的解决办法

android.os.NetworkOnMainThreadException 异常的解决办法, 刚开是把HttpURLConnectionnection 打开连接这个方法放在UI线程里了,可能不是线程安全的,而且这个方法请求是需要等待的,所以就抛出了这个异常,后来用子线程打开的HttpURLConnection, 一切就都正常了,只要在主线程里开启子线程就行了.子线程利用URL 问题解决.下面贴一段代码 String file1 = SERVER_PATH; URL url = new URL

安卓问题总结( android.os.NetworkOnMainThreadException异常)

问题描述: android.os.NetworkOnMainThreadException异常(不要在主线程访问网络资源) 问题分析: 造成这种异常的原因是安卓版本问题(仔细研究错误原因是代码不符合Android规范),网上搜索发现:android3.0版本开始(具体是不是从这个版本开始的,就不深究咯)就强制程序不能在主线程中访问网络,要把访问网络放在独立的线程中. 解决方式: 1.想要忽略这些强制策略问题的话,可以在onCreate()方法里面加上 StrictMode.setThreadPo

Android加载网络图片报android.os.NetworkOnMainThreadException异常

Android加载网络图片大致可以分为两种,低版本的和高版本的.低版本比如4.0一下或者更低版本的API直接利用Http就能实现了: 1.main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="

Android之android.os.NetworkOnMainThreadException异常解决

最近一直在做即时通讯,刚开始遇到一个问题,log打印出来的就是android.os.NetworkOnMainThreadException,大概的意思就是在主线程操作网络,以前都没注意过这个问题,也是第一次遇到!以前都是用AsyncTask,简单,快捷,还可以直接操作UI,我就是一个找虐的人,这次偏不这么做了,直接用handler,于是乎就遇到了这个问题. Android 4.0以后不允许网络操作在主线程中进行,那就用异步方法来操作 简单贴一下代码: new Thread(new Runnab

android.os.NetworkOnMainThreadException异常 (转)

转:http://blog.csdn.net/wotoumingzxy/article/details/7797295 这个异常大概意思是在主线程访问网络时出的异常. Android在4.0之前的版本 支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中了. 那么如何做才能正常运行呢? 请看这里: 例如:  从网络中获取一个Url地址. url = AuthUtil.getAuthorizationURL(); if (url == null)

android网络访问异常:android.os.NetworkOnMainThreadException

Caused by: android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java) at java.net.InetAddress.lookupHostByName(InetAddress.java:388) at java.net.InetAddress.getAllByNameImpl(InetAddress.java:23

Android 异常 android.os.NetworkOnMainThreadException

最近在实现一个Android下的数据采集的SDK,收集用户使用数据使用HTTP发送到云平台,进行数据分析.但在发送数据时报如下错误: Caused by: android.os.NetworkOnMainThreadException 产生的原因,官方解释: Class Overview The exception that is thrown when an application attempts to perform a networking operation on its main t