android.os.NetworkOnMainThreadException

本文探讨了解决Android应用中因主线程进行网络操作而导致的NetworkOnMainThreadException问题。通过调整API版本并采用两种解决方案:一是修改StrictMode设置;二是使用多线程更新UI,避免在主线程执行网络请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依旧是昨天提到的那个android app,出现了一个这样的问题,android.os.NetworkOnMainThreadException

说明是Only the original thread that created a view hierarchy can touch its views.最为纠结的是我这代码是在网上找的,把网上找的代码项目加进eclipse中,运行发现是好用的,可是我把代码原样拷贝过来却是不好用的,于是我就在找区别,发现根本就没有区别,mainfest.xml文件也一样了,于是去网上找,好吧,我好水,找了挺久,晚饭都没吃~~

进入正题:

其实原因是以为网上找的那个项目用的是4.1.2版本的android api,而我的项目中用的是4.3版本的android api,这个就是导致问题的原因,Android的相关View和控件不是线程安全的,有两种解决方法

1.在主线程中添加如下代码即可,不知道是什么,但是可以用

// 详见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()); 
2.用多线程,不再主线程里面进行更行UI的操作

Runnable   runnableUi=new  Runnable(){  
        @Override  
        public void run() {  
            //更新界面  
            final String mobile = mobileText.getText().toString();  
            final InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("mobilesoap.xml");  
        	try   
            {  
        	 	addressView.setText(MobileInfoService.getMobileAddress(inStream, mobile));  
            }
        	catch (Exception e)  
            {  
                Log.e(TAG, e.toString());  
                Toast.makeText(MainActivity.this, "查询失败", 1).show();  
            }  
        }  
          
    }; 


new Thread(){  
	                public void run(){  
	                    handler.post(runnableUi);   
	                    }                     
	            }.start();  
这样问题也就解决了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值