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