一般这种请求方式,我个人认为比较麻烦,因为很多请求的时候要写很多在这个里面,不过,这也是一种请求方式,我一般请求一张图片或是一段文字的时候会用到这个,但是如果请求的是与项目有关的json数据的时候,我一般会使用框架,因为这样来的更直接,好了废话不多说了,下面我们来说下这两个类。
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。
使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。
1. 创建HttpClient对象。
2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
4. 调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
6. 释放连接。无论执行方法是否成功,都必须释放连接
好下面我们来看下如何使用,这是我以前写的工具类里面的;
package com.icb.Net;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
/**
* Http 网络请求工具类
*
*/
public class X_HttpRequestUtil {
public static final String TAG = "HttpRequestUtil";
/**
* 简单的Get请求工具类用于发送get请求到服务器
*
* @param requestUrl
* 请求的URL
* @param encoding
* 服务器编码集
* @return 返回的json数据
*/
public static String HttpGetUtil(String requestUrl, String encoding) {
String result = null;// 返回的结果
HttpClient client = new DefaultHttpClient();// 创建HttpClient对象
HttpGet httpGet = new HttpGet(requestUrl);// GET请求方式
try {
// 调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容
HttpResponse response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 这里稍有不同,判断请求是否成功
if (entity != null) {// 判断是否为空
Log.e(TAG, "请求数据成功!");
result = EntityUtils.toString(entity, encoding);//这里可以指定下编码
}else{
result = "";
}
}else{
return result;//请求失败
}
} catch (Exception e) {
e.printStackTrace();
return result;
} finally {
Log.e(TAG, "关闭Client成功");
client.getConnectionManager().shutdown();// 连接完毕后关闭HttpClient
}
return result;
}
/**
* Get请求获取网络图片
*/
public static Bitmap HttpGetUtil(String requestUrl) {
Bitmap bitmap = null;// 返回的结果
HttpClient httpClient = new DefaultHttpClient();// 创建HttpClient对象
HttpGet httpGet = new HttpGet(requestUrl);// GET请求方式
try {
// 调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容
HttpResponse response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 这里稍有不同,判断请求是否成功
// 将请求后的内容转为bitmap
HttpEntity entity = response.getEntity();
InputStream in = entity.getContent();
bitmap = BitmapFactory.decodeStream(in);
} else {
return null;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();// 连接完毕后关闭HttpClient
}
return bitmap;
}
}
AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
大致翻译为AsyncTask这个类容易使用,这个类可以执行后台操作,并在用户界面上发布结果。这个类有三个参数
AsyncTask
Params 启动任务执行的输入参数
Progress 后台任务执行的百分比
Result 后台执行任务最终返回的结果
这个里面我们只要关心两个方法就可以了,需要重写doInBackground和onPostExecute方法,doInBackground写一些耗时操作,在onPostExecute中写更新UI的代码。
下面是一个简单的小例子:
package com.example.netrequestdemo;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Count().execute(100);
}
class Count extends AsyncTask{
@Override
protected String doInBackground(Integer... params) {
int i = params[0];
for (; i >= 0 ; i--) {
if (i == 0) {
return "count finish";
}
}
return "count not exetcute";
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
System.out.println(result);
}
}
}
最后我们把这两个类结合起来用,然后我们做一个网络图片请求:
布局:
package com.example.netrequestdemo;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView main_img;
public static final String URL = "http://img.name2012.com/uploads/allimg/2014-11/16-024509_590.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
main_img = (ImageView) findViewById(R.id.main_img);
new Count().execute(URL);
}
class Count extends AsyncTask {
@Override
protected Bitmap doInBackground(String... params) {
return HttpGetUtil(params[0]);
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
main_img.setImageBitmap(result);
}
}
/**
* Get请求获取网络图片
*/
public static Bitmap HttpGetUtil(String requestUrl) {
Bitmap bitmap = null;// 返回的结果
HttpClient httpClient = new DefaultHttpClient();// 创建HttpClient对象
HttpGet httpGet = new HttpGet(requestUrl);// GET请求方式
try {
// 调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容
HttpResponse response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 这里稍有不同,判断请求是否成功
// 将请求后的内容转为bitmap
HttpEntity entity = response.getEntity();
InputStream in = entity.getContent();
bitmap = BitmapFactory.decodeStream(in);
} else {
return null;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();// 连接完毕后关闭HttpClient
}
return bitmap;
}
}
运行效果Demo下载