现在的位置: 首页 > 综合 > 正文

赠送 HttpClient 和HttpURLConnection 的轻型网络框架 —》使用介绍

2018年02月17日 ⁄ 综合 ⁄ 共 4224字 ⁄ 字号 评论关闭

转载注明出处:http://blog.csdn.net/codingandroid/article/details/41748007


之前看网上的一些网络框架,多少存在一些bug,大多还没有源码,有些有源码,框架过于太大,发现了bug修改起来也实在费事,所以使用自己的网络框架是最佳选择哦,这个框架我这里有借鉴一些其他框架的地方,不过提供功能就是   post  请求网络。

Android使用 HttpClient 和 HttpURLConnection,当然他们都存在一些缺陷自己通过socket去写http协议稍显得麻烦,暂时先用着吧。

简单说说HttpClient 和 HttpURLConnection  这两个玩意儿的缺陷  Android 下使用DefaultHttpClient 去访问网络经常会报一个  NoHttpResponseException
这玩意儿简单看来好像本地资源不够用,导致线程被杀死了,细看,妹的,老子就开一个应用,资源绰绰有余,再细细去搜,就知道那个是DefaultHttpClient的一个缺陷,当然大家都说DefaultHttpClient缺陷很多,暂时也就不多列了,这个是最让我头疼的,有人说那么这个既然不能用,那么就果断换成HttpURLConnection这个就行啦,那么问题来了,测试过程中如果够细心你会发现一个叫 EOFException
这个的异常,难道是流木有关闭??折腾半天后可以发现,这个是HttpUrlConnection 的一个缺陷,当然网上也会有不少的解决方法,我把那些方法都加上了,还是偶然会出现这个异常,那先不管了,我想这个有时间必须要自己写一个,哎。目前在两个框架里我加了一些处理,还是出现这个异常的话,那对不起了,抓住后抛出一个timeout的异常就当超时处理了


下面简单介绍一下这个框架

将请求  解析数据,请求成功后的处理和失败后处理都分开,集中处理异常,请求都放到线程池中,当退出一个页面的时候,将这个页面没有没有结束的线程都结束掉,节省一些资源等等,之后会作一一的介绍


好了,下面看看如何这个框架的代码

package com.clxu.netframe;

import java.util.HashMap;

import org.json.JSONException;

import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.clxu.netframe.base.NetworkBaseActivity;
import com.clxu.netframe.constant.Constant;
import com.clxu.netframe.exception.MyException;
import com.clxu.netframe.net.AsyncUrlConnectionPost;
import com.clxu.netframe.net.callback.ParseCallback;
import com.clxu.netframe.net.callback.ResultCallback;
import com.clxu.netframe.util.LogUtil;

/***
 * @function 轻型网络框架使用
 *  
 * @author CLXU
 *
 * 2014-12-5
 */
public class MainActivity extends NetworkBaseActivity implements OnClickListener {
	TextView text;
	Button button;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		text = (TextView) findViewById(R.id.tv_test);
		button = (Button) findViewById(R.id.bt_test);
		
		text.setText("这里展示测试数据");
		button.setOnClickListener(this);
	}
	
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.bt_test:
			text.setText("这里展示测试数据");
			doRequest();
			break;

		default:
			break;
		}
		
	}

	/***
	 * 这里是调用的示范 
	 */
	private void doRequest(){
		String url = "http://192.168.131.211/epapp/apk/version_inspection.json";
        HashMap<String, String> map = new HashMap<String, String>();//初始化一个map对象
        map.put("user_id", ""); //存入数据
        map.put("user_pwd", "");
		if (!TextUtils.isEmpty(url)) {
			//  AsyncUrlConnectionPost 将这个类名改为  AsyncHttpClientPost 这个 就是使用 HttpClient执行 post方法了
			AsyncUrlConnectionPost asyncBaseRequest = new AsyncUrlConnectionPost(url,
					map, new ParseCallback() {
						@Override
						public Object parse(String json)
								throws JSONException {
							//这里对数据进行解析  至于使用XML 还是 json  还是直接使用的数据,我就不操心了,看你具体的需求
							//把解析完的数据return 出去     
							
							LogUtil.d("return message="+json);
							return json;
						}
					}, new ResultCallback() {
						@Override
						public void onSuccess(final Object obj) {
							//这里的  obj  就是之前   pause 方法解析后  return 的数据
							
							LogUtil.d("onSuccess message="+obj.toString());
							runOnUiThread(new Runnable() {
								public void run() {
									text.setText(obj.toString());
								}
							});
						}

						@Override
						public void onFail(final MyException e) {
							//这边是各种异常,可以捕获处理
							runOnUiThread(new Runnable() {
								@Override
								public void run() {
									if(e.getErrorCode() == Constant.NETWORK_REQUEST_IOEXCEPTION_CODE){
										Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
									}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_IOEXCEPTION_CODE){
										Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();			
									}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_SOCKET_EXCEPTION){
										Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
									}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_CONNECT_EXCEPTION){
										Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
									}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_TIMEOUT_EXCEPTION){
										Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
									}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_PERRMIT_EXCEPTION){
										Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
									}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_UNKNOWN_EXCEPTION){
										Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
									}
								}
							});
						}
					});
			mDefaultThreadPool.execute(asyncBaseRequest);
			mAsyncRequests.add(asyncBaseRequest);
		}    
	}
}

使用的时候很简单哦 NetworkBaseActivity就继承这个基类就Ok了。


后面会对这个框架进行解剖分析


框架下载地址:http://download.csdn.net/detail/brightshadow11111/8228287



抱歉!评论已关闭.