您的位置:首页 > 移动开发 > Android开发

android.os.NetworkOnMainThreadException 异常处理

2015-07-15 00:00 706 查看
摘要: 在android 4.0上运行时报android.os.NetworkOnMainThreadException异常,在4.0中,访问网络不能在主程序中进行,有三个方法可以解决,

第一种在主程序中增加:

//安卓2.3以后访问网络增加内容
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());

第二种采用异步方式:

private class GeocodeingOnclickListener implements OnClickListener{
@Override
public void onClick(View v) {
new GeocodeingTask().execute();
}
}
private class GeocodeingTask extends AsyncTask<Integer, Integer, Integer>{
@Override
protected Integer doInBackground(Integer... params) {
String url="http://maps.googleapis.com/maps/api/geocode/json?" +
"latlng=35.95405270,117.30649970&sensor=false";
//创建一个Httpclient对象
HttpClient httpClient=new DefaultHttpClient();
String responseData="";
try {
//向指定的Http地址发送请求
HttpResponse httpResponse=httpClient.execute(new HttpPost(url));
//取得服务器返回的响应
HttpEntity httpEntity=httpResponse.getEntity();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(httpEntity.getContent()));
String line="";
while((line=bufferedReader.readLine())!=null){
responseData=responseData+line;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Gson gson=new Gson();
TestResult result=gson.fromJson(responseData, TestResult.class);
System.out.println(result.toString());
return null;
}
}

第三种采用线程的方式(与第二种类似 都是异步的方式)

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 启动线程执行下载任务
new Thread(downloadRun).start();
}

/**
* 下载线程
*/
Runnable downloadRun = new Runnable(){

@Override
public void run() {
// TODO Auto-generated method stub
updateListView();
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: