解决android.os.NetworkOnMainThreadException

一个APP如果在主线程中请求网络操作,将会抛出此异常。Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。

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

第一种方法:简单暴力,强制使用,代码修改简单(但是非常不推荐) 在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码


1

2

3

4

if (android.os.Build.VERSION.SDK_INT > 9) {

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

    StrictMode.setThreadPolicy(policy);

}

第二种方法就是我使用的方法也是我要推荐的方法,将请求网络资源的代码使用Thread去操作。在Runnable中做HTTP请求,不用阻塞UI线程。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    this.setContentView(R.layout.main_view);

    new Thread(runnable).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(TAG,"请求结果:" + val);

    }

}

Runnable runnable = new Runnable(){

    @Override

    public void run() {

        // TODO: http request.

        Message msg = new Message();

        Bundle data = new Bundle();

        data.putString("value","请求结果");

        msg.setData(data);

        handler.sendMessage(msg);

    }

}

上面是比较通用的方法,我的代码:


1

2

3

4

5

6

7

8

// Android 4.0 之后不能在主线程中请求HTTP请求

            new Thread(new Runnable(){

                @Override

                public void run() {

                    cachedImage = asyncImageLoader.loadDrawable(imageUrl, position);

                    imageView.setImageDrawable(cachedImage);

                }

            }).start();

解决android.os.NetworkOnMainThreadException

时间: 2024-10-11 05:58:40

解决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开发那点破事]解决android.os.NetworkOnMainThreadException 昨天和女朋友换了手机,我的iPhone 4S 换了她得三星I9003.第一感觉就是好卡,果断刷机.以前是Android 2.3的系统.回来刷成了4.4. 好了,问题来了.在我用手机测试我们的APP的时候,抛出一个如题的异常:android.os.NetworkOnMainThreadException 第一次看到这异常,字面意思是说:在主线程中的网络异常.然后我就去了解了下这个异常,

Caused by: android.os.NetworkOnMainThreadException错误解决办法

错误Caused by: android.os.NetworkOnMainThreadException :查了下原因上在4.0之后在主线程里面执行Http请求都会报这个错,大概是怕Http请求时间太长造成程序假死的情况吧. 解决办法有两个思路,分别是: 第一种方法:直接忽视,强制使用(强烈不推荐,但是修改简单)在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码 if (android.os.Build.VERSION.S

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

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

Android之android.os.NetworkOnMainThreadException异常解决

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

android.os.NetworkOnMainThreadException

android.os.NetworkOnMainThreadException 一.出现原因 我把网络读取数据的操作写进了主线程 看名字就应该知道,是网络请求在MainThread中产生的异常 二.产生原因 官网解释 Class Overview The exception that is thrown when an application attempts to perform a networking operation on its main thread. This is only t

android.os.NetworkOnMainThreadException 在4.0之后谷歌强制要求连接网络不能在主线程进行访问

谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是: 主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭, 所以这种耗时的操作不能放在主线程里.放在子线程里,而子线程里是不能对主线程的UI进行改变的, 因此就引出了Handler,主线程里定义Handler,子线程里使用. 消息机制的写法 [1] anr Application not response 应用无响应 主线程(UI线程) [2] 如果在主线程中进行了耗时的操作 (比如连接网络 拷贝大的数据) Th

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.os.NetworkOnMainThreadException异常

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