Android之如何解决android.os.NetworkOnMainThreadException的异常

来源:互联网 发布:淘宝上二手手机良心店 编辑:程序博客网 时间:2024/06/17 11:54

android.os.NetworkOnMainThreadException

首先从字面的意思理解为网络工作在主线程的异常,也就是说网络请求不能在主线程里面
android4.0以后不能在主线程发起网络请求,该异步网络请求。


就针对此问题有两种解决的方法:

1.可以再Activity的onCreate()方法中加入这样一段代码

如下:
@Overrideprotected void onCreate(Bundle savedInstanceState){// TODO Auto-generated method stubString strVer=GetVersion.GetSystemVersion();strVer=strVer.substring(0,3).trim();float fv=Float.valueOf(strVer);if(fv>2.3){StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork() // 这里可以替换为detectAll() 就包括了磁盘读写和网络I/O.penaltyLog() //打印logcat,当然也可以定位到dropbox,通过文件保存相应的log.build());StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects() //探测SQLite数据库操作.penaltyLog() //打印logcat.penaltyDeath().build()); }super.onCreate(savedInstanceState);}


然后就可以在主线程中进行网络操作了
并在方法上加上@SuppressLint("NewApi"),重试,OK。
适用情况:如果你的应用程序执行的网络请求数据量很小的话,可以使用这种方案

2.一般情况我们应该这样做

      有一个好方法可以让你的应用保持快速响应,那就是让主UI线程尽量少做事情,如果在UI线程中做一个耗时过长的处理,会导致UI僵死,因此对于有可能耗时过长的任务应该另起一个线程处理。这种典型的应用场景就是做网络相关的操作,因为网络传输过程中可能有意料不到的延迟。通常来说,用户可以忍受反馈时的一小段等待,但界面僵死就是另外一回事了。

1、将网络访问放到单独线程中:

如:new Thread(){@Overridepublic void run(){//你要执行的方法//执行完毕后给handler发送一个空消息handler.sendEmptyMessage(0);}}.start(); //定义Handler对象private Handler handler =new Handler(){@Override//当有消息发送出来的时候就执行Handler的这个方法public void handleMessage(Message msg){super.handleMessage(msg);//处理UI}};

2、将网络访问放到异步任务AsyncTask中




0 0