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

android.os.NetworkOnMainThreadException

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


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

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

如下:
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
String 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(){
@Override
public 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中




你可能感兴趣的:(android)