首页Androidandroid技术 › 读取网络图片,getResponseCode()方法的时候抛出异常

读取网络图片,getResponseCode()方法的时候抛出异常

读取网络图片,但是每次都是在执行.getResponseCode()方法的时候抛出异常,快要崩溃了,到底是怎么回事,代码如下
package com.qxj.lixinxing.service;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import com.qxj.lixinxing.utils.StreamTool;
import android.net.Uri;
import android.util.Log;
public class ImageService {
    public static byte[] getImage(String path) throws Exception {       
        
        URL url = new URL(path);     //得到资源地址   
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();   //得到连接
        connection.disconnect();
        connection.setConnectTimeout(5000);     //如果5000毫秒内未连接到就超时       
        connection.setRequestMethod("GET");            //以“get”方式发出请求
        //每次执行到下面判断语句的时候就会抛出异常,是怎么回事?
        if(connection.getResponseCode() == 200) {   //如果数据存在,执行下一步                   
            InputStream inStream = connection.getInputStream();   //得到网络返回的输入流           
            return StreamTool.read(inStream);                     //将输入流转换为二进制数据
        }       
        return null;
    }
}
很明显了 把网络操作放在线程中操作,这个错误很明显的告诉你 你把网络操作放在了主线程 这是不允许的!你需要另起线程进行网络操作
new thread(){public void run(){
写上你的那些代码试试!
}

}.start()

找出问题点了,在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://www.94taba.com/?p=400

上一篇:

下一篇: