转载注明出处: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); } } }
后面会对这个框架进行解剖分析
框架下载地址:http://download.csdn.net/detail/brightshadow11111/8228287
赠送 HttpClient 和HttpURLConnection 的轻型网络 ---》框架使用介绍
原文地址:http://blog.csdn.net/codingandroid/article/details/41748007