`
datuo
  • 浏览: 82295 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

android中封装http请求

阅读更多

HttpConnectionUtils 支持get post put delete请求 图片请求

 

 

/**
 * HTTP connection helper
 * @author
 *
 */
public class HttpConnectionUtils implements Runnable {
	private static final String TAG = HttpConnectionUtils.class.getSimpleName();
	public static final int DID_START = 0;
	public static final int DID_ERROR = 1;
	public static final int DID_SUCCEED = 2;

	private static final int GET = 0;
	private static final int POST = 1;
	private static final int PUT = 2;
	private static final int DELETE = 3;
	private static final int BITMAP = 4;

	private String url;
	private int method;
	private Handler handler;
	private List<NameValuePair> data;

	private HttpClient httpClient;

	public HttpConnectionUtils() {
		this(new Handler());
	}

	public HttpConnectionUtils(Handler _handler) {
		handler = _handler;
	}
	
	public void create(int method, String url, List<NameValuePair> data) {
		Log.d(TAG, "method:"+method+" ,url:"+url+" ,data:"+data);
		this.method = method;
		this.url = url;
		this.data = data;
		ConnectionManager.getInstance().push(this);
	}

	public void get(String url) {
		create(GET, url, null);
	}

	public void post(String url, List<NameValuePair> data) {
		create(POST, url, data);
	}
	
	public void put(String url, List<NameValuePair> data) {
		create(PUT, url, data);
	}

	public void delete(String url) {
		create(DELETE, url, null);
	}

	public void bitmap(String url) {
		create(BITMAP, url, null);
	}

	@Override
	public void run() {
		handler.sendMessage(Message.obtain(handler, HttpConnectionUtils.DID_START));
		httpClient = new DefaultHttpClient();
		HttpConnectionParams
				.setConnectionTimeout(httpClient.getParams(), 6000);
		try {
			HttpResponse response = null;
			switch (method) {
			case GET:
				response = httpClient.execute(new HttpGet(url));
				break;
			case POST:
				HttpPost httpPost = new HttpPost(url);
				httpPost.setEntity(new UrlEncodedFormEntity(data,HTTP.UTF_8));
				response = httpClient.execute(httpPost);
				break;
			case PUT:
				HttpPut httpPut = new HttpPut(url);
				httpPut.setEntity(new UrlEncodedFormEntity(data,HTTP.UTF_8));
				response = httpClient.execute(httpPut);
				break;
			case DELETE:
				response = httpClient.execute(new HttpDelete(url));
				break;
			case BITMAP:
				response = httpClient.execute(new HttpGet(url));
				processBitmapEntity(response.getEntity());
				break;
			}
			if (method < BITMAP)
				processEntity(response.getEntity());
		} catch (Exception e) {
			handler.sendMessage(Message.obtain(handler,
					HttpConnectionUtils.DID_ERROR, e));
		}
		  ConnectionManager.getInstance().didComplete(this);
	}

	private void processEntity(HttpEntity entity) throws IllegalStateException,
			IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(entity
				.getContent()));
		String line, result = "";
		while ((line = br.readLine()) != null)
			result += line;
		Message message = Message.obtain(handler, DID_SUCCEED, result);
		handler.sendMessage(message);
	}

	private void processBitmapEntity(HttpEntity entity) throws IOException {
		BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
		Bitmap bm = BitmapFactory.decodeStream(bufHttpEntity.getContent());
		handler.sendMessage(Message.obtain(handler, DID_SUCCEED, bm));
	}

 

 

ConnectionManager

 

public class ConnectionManager {
	public static final int MAX_CONNECTIONS = 5;
	 
	private ArrayList<Runnable> active = new ArrayList<Runnable>();
    private ArrayList<Runnable> queue = new ArrayList<Runnable>();

    private static ConnectionManager instance;

    public static ConnectionManager getInstance() {
         if (instance == null)
              instance = new ConnectionManager();
         return instance;
    }

    public void push(Runnable runnable) {
         queue.add(runnable);
         if (active.size() < MAX_CONNECTIONS)
              startNext();
    }

    private void startNext() {
         if (!queue.isEmpty()) {
              Runnable next = queue.get(0);
              queue.remove(0);
              active.add(next);

              Thread thread = new Thread(next);
              thread.start();
         }
    }

    public void didComplete(Runnable runnable) {
         active.remove(runnable);
         startNext();
    }

}

 

 封装的Handler HttpHandler  也可以自己处理

 

public class HttpHandler extends Handler {

	private Context context;
	private ProgressDialog progressDialog;

	public HttpHandler(Context context) {
		this.context = context;
	}

	protected void start() {
		progressDialog = ProgressDialog.show(context,
				"Please Wait...", "processing...", true);
	}

	protected void succeed(JSONObject jObject) {
		if(progressDialog!=null && progressDialog.isShowing()){
			progressDialog.dismiss();
		}
	}

	protected void failed(JSONObject jObject) {
		if(progressDialog!=null && progressDialog.isShowing()){
			progressDialog.dismiss();
		}
	}
	
	protected void otherHandleMessage(Message message){
	}
	
	public void handleMessage(Message message) {
		switch (message.what) {
		case HttpConnectionUtils.DID_START: //connection start
			Log.d(context.getClass().getSimpleName(),
					"http connection start...");
			start();
			break;
		case HttpConnectionUtils.DID_SUCCEED: //connection success
			progressDialog.dismiss();
			String response = (String) message.obj;
			Log.d(context.getClass().getSimpleName(), "http connection return."
					+ response);
			try {
				JSONObject jObject = new JSONObject(response == null ? ""
						: response.trim());
				if ("true".equals(jObject.getString("success"))) { //operate success
					Toast.makeText(context, "operate succeed:"+jObject.getString("msg"),Toast.LENGTH_SHORT).show();
					succeed(jObject);
				} else {
					Toast.makeText(context, "operate fialed:"+jObject.getString("msg"),Toast.LENGTH_LONG).show();
					failed(jObject);
				}
			} catch (JSONException e1) {
				if(progressDialog!=null && progressDialog.isShowing()){
					progressDialog.dismiss();
				}
				e1.printStackTrace();
				Toast.makeText(context, "Response data is not json data",
						Toast.LENGTH_LONG).show();
			}
			break;
		case HttpConnectionUtils.DID_ERROR: //connection error
			if(progressDialog!=null && progressDialog.isShowing()){
				progressDialog.dismiss();
			}
			Exception e = (Exception) message.obj;
			e.printStackTrace();
			Log.e(context.getClass().getSimpleName(), "connection fail."
					+ e.getMessage());
			Toast.makeText(context, "connection fail,please check connection!",
					Toast.LENGTH_LONG).show();
			break;
		}
		otherHandleMessage(message);
	}

}

 

 我这儿server端返回的数据都是json格式。必须包括{success:"true",msg:"xxx",other:xxx} 操作成功success为true.

 

调用的代码:

 

	private Handler handler = new HttpHandler(LoginActivity.this) {		
		@Override
		protected void succeed(JSONObject jObject) { //自己处理成功后的操作
			super.succeed(jObject);
		} //也可以在这重写start() failed()方法
	};
	
	private void login() {
		ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
		params.add(new BasicNameValuePair("email", loginEmail.getText().toString()));
		params.add(new BasicNameValuePair("password", loginPassword.getText().toString()));
		String urlString = HttpConnectionUtils.getUrlFromResources(LoginActivity.this, R.string.login_url);
		new HttpConnectionUtils(handler).post(urlString, params);
	
	}

 

 

分享到:
评论
7 楼 helloaini7 2014-05-07  
6 楼 shiqingwang 2013-09-10  
为什么我的context一直为null啊
private Handler handler = new HttpHandler(getActivity()) {
@Override
protected void succeed(JSONObject jObject) { //自己处理成功后的操作
super.succeed(jObject);
} //也可以在这重写start() failed()方法
};
5 楼 ty_change 2012-09-28  
封装的很不错,但是还可以改进一下
比如说
public void create(int method, String url, List<NameValuePair> data) { 
        Log.d(TAG, "method:"+method+" ,url:"+url+" ,data:"+data); 
        this.method = method; 
        this.url = url; 
        this.data = data; 
        ConnectionManager.getInstance().push(this); 
    } 
这边可以改为
public void create(int method, String url, HttpEntity entity) { 
        Log.d(TAG, "method:"+method+" ,url:"+url+" ,data:"+data); 
        this.method = method; 
        this.url = url; 
        this.entity= entity; 
        ConnectionManager.getInstance().push(this); 
    }
这样子的话 不限制于 UrlEncodedFormEntity还是 StringEntity 还是 InputStreamEntity  更加灵活!
不过楼主已经封装的很好了 顶一个。
4 楼 wenzhixin 2012-06-18  
谢谢,学习了
3 楼 sf_molice 2012-04-10  
明了,run运行结束后就自动停止。
2 楼 sf_molice 2012-04-10  
连接请求结束后,不用停止该线程吗?
1 楼 sexy22 2012-04-09  
非常不错,呵呵

相关推荐

    封装android的http请求

    本主题主要探讨如何在Android中封装HTTP请求。 一、选择合适的HTTP库 Android开发中常用的HTTP库有OkHttp、Volley、Retrofit等。这里以广泛使用的OkHttp为例,它提供了高效的网络请求功能,支持异步和同步请求,...

    android 网络请求封装

    在Android开发中,网络请求是应用与服务器交互的基础,它涉及到数据的获取、发送和处理。为了提高代码的可复用性和可维护性,通常会将网络请求进行封装,以便在多个地方方便地调用。以下是一些关于“Android网络请求...

    Android-基于RxJava封装的OkHttp网络请求库

    4. **错误处理**:通过onErrorResumeNext或catchError等操作符处理网络请求中的异常,确保程序的健壮性。 5. **订阅和取消**:在Activity或Fragment中,我们通过subscribe方法订阅Observable,并在适当的时候(如...

    网络Http请求的完整封装

    本项目"网络Http请求的完整封装"旨在提供一个全面的解决方案,方便开发者快速、高效地处理各种HTTP请求,包括GET和POST,以及图片下载功能。同时,它还包含了网络请求的进度显示和跨线程通信机制,极大地提高了用户...

    android http 多请求异步封装

    本demo主要对异步请求封装 可用作基本项目框架来使用 网络请求等等小细节已经ok 如有需要请进一步更改 1)封装HttpClient 2)由于用到线程池,可以进行多任务网络请求操作 3)没有网络的时候进行网络状态检查 4)对...

    Android AndBase框架使用封装好的函数完成Http请求(三)

    在Android开发中,网络请求是应用与服务器交互的重要部分,AndBase框架提供了一种便捷的方式来完成Http请求。本文主要探讨如何使用AndBase框架进行无参和有参的Http Get及Post请求。 首先,我们来看如何使用AndBase...

    android请求webservice需要的soap工具封装

    本篇文章将深入探讨如何在Android中利用ksoap2-android-assemble库进行SOAP请求的封装,以便更高效地进行网络通信。 首先,我们需要了解ksoap2-android-assemble库。这是一个轻量级的Java库,专门为Android平台设计...

    【Android】Android 封装 Http 请求工具(csdn)————程序.pdf

    这篇教程主要介绍了如何在Android中封装一个简单的HTTP请求工具类,便于重复利用和管理网络请求。以下是对工具类`HttpUtils`的详细分析: 1. **工具类结构**: 工具类`HttpUtils`主要提供了`getRequest`方法来处理...

    android 异步线程http请求模块封装

    "android 异步线程http请求模块封装"是一个旨在提高开发效率、优化代码结构和增强可维护性的实践。它通过将网络请求功能封装成独立的模块,避免了在主线程中执行网络操作导致的ANR(Application Not Responding)...

    Android网络请求封装,可动态切换网络引擎

    在Android系统中,HTTP请求可以通过多种方式实现,如使用Android自带的HttpURLConnection,或者是第三方库如Volley、Retrofit、OkHttp等。OkHttp因其高效的性能、良好的API设计以及丰富的特性,成为了许多开发者首选...

    Android网络请求框架基于HttpUrlConnection的封装

    在Android应用开发中,网络请求是必不可少的一部分,用于获取服务器数据、更新UI或者进行其他交互。本篇文章将深入探讨如何基于HttpUrlConnection实现一个自定义的网络请求框架。HttpUrlConnection是Android系统提供...

    Android开发 okhttp网络请求使用demo,包括上传文件方法封装

    然后,在`POST`请求中设置请求体: ```java Request request = new Request.Builder() .url(uploadUrl) .post(requestBody) .build(); ``` - **多个文件上传:** 对于多文件上传,我们可以创建一个`...

    Android-EasyHttp是一个基于OkHttp封装的KotlinDSL网络请求框架

    EasyHttp就是这样一款专为Android设计的网络请求框架,它基于强大的OkHttp进行了封装,为开发者提供了更简洁、易用的API接口,特别是采用了Kotlin的DSL(Domain Specific Language)语法,使得代码更加优雅和可读。...

    Android之封装好的异步网络请求框架

    Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnection,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用这个MyHttpUtils库可以大大的简化操作,它是基于...

    Android中鸿洋封装的OkHttp框架详解

    7. **错误处理**:OkHttp提供了统一的异常处理机制,便于开发者处理网络请求中的各种异常情况。鸿洋的封装可能对此进行了封装,提供了更友好的错误处理方案。 8. **性能监控**:鸿洋的封装可能集成了性能监控功能,...

    Android实战——okhttp3的使用和封装

    这个类可以提供一系列静态方法,如`get()`、`post()`等,用于发起HTTP请求。下面是一个简单的封装示例: ```java public class HttpUtils { private static OkHttpClient client = new OkHttpClient(); public ...

    Android 封装的工具类

    在Android应用中,我们常常需要与服务器进行数据交互,这就涉及到了HTTP网络请求。`HttpUtils`通常会封装Apache的HttpClient库或OkHttp库,提供发送GET、POST请求,处理响应结果等方法。这些方法简化了网络调用,...

    网络请求的封装

    在IT行业中,网络请求是应用程序与服务器交互的基础,特别是在移动应用开发中,高效、可靠的网络请求封装至关重要。本文将详细探讨标题"网络请求的封装"所涵盖的几个关键技术和库,包括HttpURLConnection、xUtils、...

    Android 常用封装库

    2. **Http类**:Android原生的HTTP请求方式是`HttpURLConnection`,但它使用起来相对复杂。因此,开发者通常使用第三方库,如`Volley`、`OkHttp`和`Retrofit`,它们提供了更简洁、高效的网络请求接口,并支持异步...

    android Http请求

    在Android开发中,HTTP请求是应用与服务器交互的基础,用于获取或发送数据。本文将详细介绍Android中的四种主要HTTP请求方式:GET、POST、HttpClient以及OkHttp,并探讨它们的应用场景和优缺点。 一、GET请求 GET是...

Global site tag (gtag.js) - Google Analytics