Android加载网络图片android.os.NetworkOnMainThreadException异常解决方法

时间:2022-01-10 17:34:56

异常:android.os.NetworkOnMainThreadException

2012-11-21 本文转自于J2MEN小开发者
本文地址:异常:android.os.NetworkOnMainThreadException

Android 4.1项目:使用新浪微博分享时报:

android.os.NetworkOnMainThreadException

网上搜索后知道是因为版本问题,在4.0之后在主线程里面执行Http请求都会报这个错,也许是怕Http请求时间太长造成程序假死的情况吧。那么网上的朋友也给出了相应的解决方案,这叫上有政策下有对策:

一:在发起Http请求的Activity里面的onCreate函数里面添加如下代码:

   

  1. StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
  2.         .detectDiskReads()  
  3.         .detectDiskWrites()  
  4.         .detectNetwork()   // or .detectAll() for all detectable problems  
  5.         .penaltyLog()  
  6.         .build());  
  7. StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
  8.         .detectLeakedSqlLiteObjects()  
  9.         .detectLeakedClosableObjects()  
  10.         .penaltyLog()  
  11.         .penaltyDeath()  
  12.         .build());

如果正在做的项目不是Android 4.0的是看不到StrictMode类的。我也是用的网上给的com_weibo_android.jar。但是这个jar包下载下来的时候是2.3的,要先转换成Android 4.0的项目,再在分享对应的ShareActivity的onCreate()函数中添加上面的两行代码。这样就不会报这个错误了。

二:使用Thread、Runnable、Handler这三个类:

1234567891011121314151617181920212223242526272829 publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);this.setContentView(R.layout.share_mblog_view);new Thread(runnable).start();} Handlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);Bundledata=msg.getData();String val=data.getString("value");Log.i("mylog","请求结果为-->"+val);}} Runnablerunnable=newRunnable(){@Overridepublicvoidrun(){//// TODO: http request.//Messagemsg=newMessage();Bundle data=newBundle();data.putString("value","请求结果");msg.setData(data);handler.sendMessage(msg);}}

自己走了不少弯路。

另一种是启动线程执行下载任务:

    public void onCreate(Bundle savedInstanceState) {

Java代码  Android加载网络图片android.os.NetworkOnMainThreadException异常解决方法
  1.       super.onCreate(savedInstanceState);  
  2.       setContentView(R.layout.main);  
  3.       // 启动线程执行下载任务  
  4.       new Thread(downloadRun).start();  
  5.   }  
  6.     
  7.   /** 
  8.    * 下载线程 
  9.    */  
  10.   Runnable downloadRun = new Runnable(){  
  11.   
  12. @Override  
  13. public void run() {  
  14.     // TODO Auto-generated method stub  
  15.     updateListView();  
  16. }  
  17.   }; 
http://geeksun.iteye.com/blog/1447708

http://www.j2men.com/index.php/archives/1849