- android中Http访问时 connection.getResponseCode()不被执行
-
问题:用 android 4.2 写android访问http时,到connection.getResponseCode() 就不被执行,也不报错。如下面红色字体:12345678910111213141516171819202122232425262728293031323334353637383940414243444546public
static
String getJsonContent(String url_path ,String encode){
String jsonString =
""
;
try
{
URL url =
new
URL(url_path);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setConnectTimeout(
3000
);
connection.setRequestMethod(
"GET"
);
connection.setDoInput(
true
);
//从服务器获得数据
int
responseCode = connection.getResponseCode();
if
(
200
== responseCode) {
jsonString = changeInputStream(connection.getInputStream(),encode);
}
}
catch
(Exception e) {
// TODO: handle exception
}
//
return
jsonString;
}
private
static
String changeInputStream(InputStream inputStream , String encode)
throws
IOException {
// TODO Auto-generated method stub
String jsonString =
null
;
ByteArrayOutputStream outputStream =
new
ByteArrayOutputStream();
byte
[] data =
new
byte
[
1024
];
int
len =
0
;
while
((len=inputStream.read(data))!=-
1
){
outputStream.write(data,
0
, len);
}
jsonString =
new
String(outputStream.toByteArray(), encode);
inputStream.close();
return
jsonString;
}
此段代码直接在java 工程里是可以访问http的,并且用浏览器直接访问 urp_path = http://192.168.0.102:8080/json_Project/servlet/JsonAction?action_flag=person 也是有相应的,证明url地址是对的。
找出问题点了,在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
如果一定要这样操作的话,需要在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
解决方法:
原因:访问HTTP的请求没有放在单独线程而是放在主线程了,很明显了 把网络操作放在线程中操作,这个错误很明显的告诉你 你把网络操作放在了主线程 这是不允许的!你需要另起线程进行网络操作
new thread(){
public void run(){
写上你的那些代码试试!
}
}.start()。不能再main方法里面添加网络请求,另启一个线程就可以了;
或者是把http的请求单独放在一个新线程中,或者在调用此Http访问的Activity的onCreat()方法内加:
closeStrictMode();
放在oncreate()下面
public static void closeStrictMode() {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll().penaltyLog().build());
}