android中Http访问时 connection.getResponseCode()不被执行

android中Http访问时 connection.getResponseCode()不被执行


问题:用 android 4.2 写android访问http时,到connection.getResponseCode() 就不被执行,也不报错。如下面红色字体:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public 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());
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值