###问题描述:
在android 4.0上运行时报android.os.NetworkOnMainThreadException
异常
原因:
在4.0中,访问网络不能在主程序中进行
解决方法:
有三个方法可以解决
- 使用StrictMode:
这个类可以用来帮助开发者改进他们编写的应用,并且提供了各种的策略,这些策略能随时检查和报告开发者开发应用中存在的问题,比如可以监视那些本不应该在主线程中完成的工作或者其他的一些不规范和不好的代码。
//安卓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 MyOnclickListener implements OnClickListener{
@Override
public void onClick(View v) {
new MyTask().execute();
}private class MyTask 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; }
-
采用线程的方式(与第二种类似,都是异步的方式)
protected void onCreate(Bundle savedInstanceState) {{
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();
}
};
- 下载线程
注意:后面两种方法,若要刷新UI线程,需要使用runOnUiThread
,否则会出现错误 Can't create handler inside thread that has not called Looper.prepare()