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;
}
}
}