Http请求之HttpClient + AsyncTask异步请求

一般这种请求方式,我个人认为比较麻烦,因为很多请求的时候要写很多在这个里面,不过,这也是一种请求方式,我一般请求一张图片或是一段文字的时候会用到这个,但是如果请求的是与项目有关的json数据的时候,我一般会使用框架,因为这样来的更直接,好了废话不多说了,下面我们来说下这两个类。

HttpClient(GET请求为例)

HttpClientApache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。

 

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

1. 创建HttpClient对象。

2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

3. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse

4. 调用HttpResponsegetEntity()方法可获取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

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>

Params 启动任务执行的输入参数

Progress 后台任务执行的百分比

Result 后台执行任务最终返回的结果

这个里面我们只要关心两个方法就可以了,需要重写doInBackgroundonPostExecute方法,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<Integer, Integer, String>{

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


最后我们把这两个类结合起来用,然后我们做一个网络图片请求:


布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.netrequestdemo.MainActivity" >

    <ImageView
        android:id="@+id/main_img"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>


java代码部分:

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<String, Integer, Bitmap> {
		@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下载


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值