HttpClient和HttpURLConnection理解

HttpClient:

是一个被封装的开源框架,DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。

但同时也由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不积极,6.0版本之后被谷歌删除。

HttpURLConnection:

它没有被封装,是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。

不过在Android 2.2版本之前,HttpURLConnection一直存在着一些令人厌烦的bug。比如说对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效。


使用对比

public class MainActivity extends Activity implements OnClickListener {
private Button mBtn;
private Button mBtn2;
private ImageView mImg;
private String str="http://img.moko.cc/users/0/51/15422/images/post/src/b35eadee-a12a-435a-a9a5-602bcd86d53e.jpg";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }
    private Handler hand=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            if (msg.what==200) {
                Bitmap bitmap=(Bitmap) msg.obj;
                mImg.setImageBitmap(bitmap);
            }
        }

    };
    private void initView() {
        // TODO Auto-generated method stub
        mBtn=(Button) findViewById(R.id.mBtn);
        mBtn2=(Button) findViewById(R.id.mBtn2);
        mImg=(ImageView) findViewById(R.id.mImg);
        mBtn.setOnClickListener(this);//HttpCliet
        mBtn2.setOnClickListener(this);
    }
@Override
    public void onClick(View arg0) {
        switch (key) {
        case R.id.mBtn:
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //创建一个默认的httpclient对象
                    HttpClient hc=new DefaultHttpClient();
                    //创建一个get请求,传入网址
                    HttpGet hg=new HttpGet(str);
                    try {
                        //获取返回值,执行联网请求,获取返回值
                        HttpResponse response = hc.execute(hg);
                        //从返回值获取出当前需要的数据流--》从表格中获取
                        InputStream is = response.getEntity().getContent();
                        //从输入流中获取图片
                        Bitmap bitmap=BitmapFactory.decodeStream(is);
                        Message message=hand.obtainMessage();
                        message.what=200;
                        message.obj=bitmap;
                        hand.sendMessage(message);
                    } catch (ClientProtocolException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            }).start();
            break;

        case R.id.mBtn2:
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        URL url=new URL(str);
                        //获取HttpURLconnecction
                        HttpURLConnection conn=(HttpURLConnection) url.openConnection();
                        //设置连接时间
                        conn.setConnectTimeout(30*1000);
                        //设置读取超时时间
                        conn.setReadTimeout(60*1000);
                        //是否可读
                        conn.setDoInput(true);
                        //是否可写
                        conn.setDoOutput(true);
                        //设置请求方式
                        conn.setRequestMethod("POST");
                        //从 conn中获取流
                        InputStream is = conn.getInputStream();
                        String path="/mnt/sdcard/mosN.jpg";
                        File file=new File(path);
                        BufferedInputStream bis=new BufferedInputStream(is);
                        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));
                        int len=0;
                        byte [] by=new byte[8*1024];
                        while ((len=bis.read(by))!=-1) {
                            bos.write(by, 0, len);
                            Log.e("", ""+len);
                        }
                        bos.flush();
                        bos.close();
                        bis.close();
                        is.close();
                        Bitmap bitmap=BitmapFactory.decodeFile(path);
                        Message msg=hand.obtainMessage();
                        msg.what=200;
                        msg.obj=bitmap;
                        hand.sendMessage(msg);
                    } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }).start();
            break;
        }   
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值