android.os.NetworkOnMainThreadException异常 (转)

转:http://blog.csdn.net/wotoumingzxy/article/details/7797295

这个异常大概意思是在主线程访问网络时出的异常。 Android在4.0之前的版本 支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中了。

那么如何做才能正常运行呢? 请看这里:
例如:  从网络中获取一个Url地址。

    url = AuthUtil.getAuthorizationURL();
    if (url == null) {
        Toast.makeText(WebViewActivity.this, R.string.auth_url_empty, 3000).show();
    }

如果直接写在主线程中的话 在2.x 版本中还是能运行 但是在4.0以后就会出现错误。

网上也有很多相关资料比如说在主线程中添加

    // 详见StrictMode文档
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectDiskReads()
            .detectDiskWrites()
            .detectNetwork()   // or .detectAll() for all detectable problems
            .penaltyLog()
            .build());
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
            .detectLeakedSqlLiteObjects()
            .detectLeakedClosableObjects()
            .penaltyLog()
            .penaltyDeath()
            .build());

但是

.detectLeakedClosableObjects()  会报错,

也就是说这个方法不用,但是查看源码发现其方法是公共的

   / **
                 * Detect when an {@link java.io.Closeable} or other
                 * object with a explict termination method is finalized
                 * without having been closed.
                 *
                 * <p>You always want to explicitly close such objects to
                 * avoid unnecessary resources leaks.
                 */
                public Builder detectLeakedClosableObjects() {
                    return enable(DETECT_VM_CLOSABLE_LEAKS);
                }

这个我就有点搞不清楚怎么回事,资历尚浅还不会。哈哈。

所以我就用第二种方法 也就是多线程,异步加载的方式加载数据。

代码如下:

在主函数中发送一个空的消息 :

    new Thread(){
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    super.run();
                    url = AuthUtil.getAuthorizationURL();
                    if (url == null) {
                        Toast.makeText(WebViewActivity.this, R.string.auth_url_empty, 3000).show();
                    }
                    handler.sendEmptyMessage(0);
                }
            }.start();

在handler中接受到消息 作出相应的处理。

private Handler handler = new Handler() {

		public void handleMessage(Message msg) {
			switch (msg.what) {
				case 0:
				<span style="white-space:pre">	</span>load(url, webView);
					break;
			}
		};
	};

这样就解决的这个异常。

有什么不对的地方,请多指教。



2014年10月16日14:15:58

本质上来讲,目前Android开发中,有关网络访问的部分是不可以放到主线程当中了!

时间: 2024-08-07 18:23:23

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异常

最近好忙啊,准备完比赛的东西就准备驾考,终于可以稍微歇息下了,好久没写了.今天解决了一个对之前的我来说是一个很大的问题,好开心呀!! 之前项目开发是用2.3开发 测试手机是android4.4时候提示 android.os.NetworkOnMainThreadException异常 第一次看到这异常,字面意思是说:在主线程中的网络异常.然后我就去了解了下这个异常,先看看官方的说明: public class NetworkOnMainThreadException extends Runtim

安卓问题总结( 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网络访问异常: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