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 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.

http://developer.android.com/intl/zh-cn/reference/android/os/NetworkOnMainThreadException.html

上面的意思是,从SDK3.0开始,google不再允许网络请求(HTTP、Socket)等相关操作直接在主线程中,其实本来就不应该这样做,直接在UI线程进行网络操作,会阻塞UI、用户体验不好。

也就是说,在SDK3.0以下的版本,还可以继续在主线程里这样做,在3.0以上,就不行了。所以,在下面的代码中,使用Thread、Runnable、Handler这三个类:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.test);
    // 开启一个子线程,进行网络操作,等待有返回结果,使用handler通知UI
    new Thread(networkTask).start();
}  

Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        Bundle data = msg.getData();
        String val = data.getString("value");
        Log.i("mylog", "请求结果为-->" + val);
        // UI界面的更新等相关操作
    }
};  

/**
 * 网络操作相关的子线程
 */
Runnable networkTask = new Runnable() {  

    @Override
    public void run() {
        // 在这里进行 http request.网络请求相关操作
	MobEventService.postonKillProcess(context);
        Message msg = new Message();
        Bundle data = new Bundle();
        data.putString("value", "请求结果");
        msg.setData(data);
        handler.sendMessage(msg);
    }
};  

第二种、使用异步机制如:asynctask,这个举个简单的加载网络图片的例子:

class DownImage extends AsyncTask {  

    private ImageView imageView;  

    public DownImage(ImageView imageView) {
        this.imageView = imageView;
    }  

    @Override
    protected Bitmap doInBackground(String... params) {
        String url = params[0];
        Bitmap bitmap = null;
        try {
            //加载一个网络图片
            InputStream is = new URL(url).openStream();
            bitmap = BitmapFactory.decodeStream(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }  

    @Override
    protected void onPostExecute(Bitmap result) {
        imageView.setImageBitmap(result);
    }
}  

第三种、直接忽视,强制使用(强烈不推荐,但是修改简单)

在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

请记住,如果在主线程里声明了一个handler,这个handler所Post 的 Runnable(Thread)、以及处理的message都是在当前的主线程里,非子线程。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-28 20:07:43

Android 异常 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网络访问异常: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 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.os.NetworkOnMainThreadException

Android 4.2项目:下载网络歌曲 报错:android.os.NetworkOnMainThreadException 网上搜索后知道是因为版本问题,在4.0之后在主线程里面执行Http请求都会报这个错,也许是怕Http请求时间太长造成程序假死的情况吧.那么网上的朋友也给出了相应的解决方案,这叫上有政策下有对策: 一:在发起Http请求的Activity里面的onCreate函数里面添加如下代码: //详见StrictMode文档StrictMode.ThreadPolicy polic

Android之android.os.NetworkOnMainThreadException异常解决

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