今天在尝试的开发安卓,在客户端上解析服务器返回的json数据,但是在解析json时候总是读取不到值,就进行一系列调试,发现,在以下代码段
try {
URL url = new URL(url_path);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setConnectTimeout(3000);
connection.setRequestMethod("GET");
connection.setDoInput(true);//输入流
int code = connection.getResponseCode();
if (code == 200) {//表示服务器已经准备好
return changeInputStream(connection.getInputStream());
}
} catch (Exception e) {
// TODO: handle exception
}
这里链接服务器的时候无响应,即在connection.getResponseCode()的时候返回了一个空值,在检查url完成没有错的情况下,一头雾水,后来查询了资料才知道
在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
解决该问题有两种方式,
一就是,就是把方法放进新的线程中:
new Thread()
{
你的方法。。。。
}.start;
第二种方法
如果一定要这样操作的话,需要在MainActivity中加入如下代码:
StrictMode.setThreadPolicy(new
StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(
new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
并且在配置文件中将SDK的最低等级设为11
以上