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;
        }   
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章