GalHttprequest 是一个android平台上一个轻量级的http网络请求及缓存框架。
当前GalHttpRequest支持以下功能:
同步请求Stirng、InputStream、Bitmap;
异步请求String、InputStream、Bitmap;支持回调接口;
支持异步下载文件,提供监听进度回调接口;
支持缓存参数设置;
支持多线程及队列请求;
自动适配移动、联通、电信wap代理;
支持快捷post请求;
项目如图:
效果如图:
主要部分就十一个目标文件,其定义如下:
//解析日期的日期和时间(RFC822和W3CDateTime的格式字符串) public class DateParser
主要部分就十一个目标文件,其定义如下: //解析日期的日期和时间(RFC822和W3CDateTime的格式字符串) public class DateParser
//下载参数 成员下载路径 、在状态栏的标题、保存文件名等等 public class GalDownloadParams
//下载任务 使用了同步任务 public class GalDownLoadTask extends AsyncTask<GalDownloadParams, Integer, Void>
//自定义字符串单元 有UTF编解码、获得sd路径、字符串分割、半角转全角等操作 public class GalStringUtil
//自定义url public class GALURL
//输入单元 public class LogUtil
//构造MD5值 public class MD5
//下载任务监听 加载进程 加载完成 加载失败 加载取消 public class SimpleDownLoadTaskListener implements GalDownLoadTaskListener
/* * 定制自己的HttpClient,确保唯一实例,提供全局访问接口 * 自定义timeout时间等参数 */ public class MyHttpClient
//http请求 构造请求参数、请求头、处理返回信息等操作 //使用线程池,来重复利用线程,优化内存 public class GalHttpRequest
//线程池的定义 private static ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors .newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); //Executors的静态方法newCachedThreadPool, newFixedThreadPool, newScheduledThreadPool //所返回的线程池都是ThreadPoolExecutor对象或者其子类对象. //ThreadPoolExecutor提供了多种配置, 可以根据实际定制合适的线程池.
//初始化单击监听 private void initListener() { listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String item = (String) parent.getAdapter().getItem(position); int type = 0; if ("同步请求InputStream".equalsIgnoreCase(item)) { type = RequestType.SYNC_REQUESTIS; } else if ("同步请求String".equalsIgnoreCase(item)) { type = RequestType.SYNC_REQUESTSTRING; } else if ("同步请求Bitmap".equalsIgnoreCase(item)) { type = RequestType.SYNC_REQUESTBITMAP; } else if ("异步请求InputStream".equalsIgnoreCase(item)) { type = RequestType.ASYN_REQUESTIS; } else if ("异步请求String".equalsIgnoreCase(item)) { type = RequestType.ASYN_REQUESTSTRING; } else if ("异步请求Bitmap".equalsIgnoreCase(item)) { type = RequestType.ASYN_REQUESTBITMAP; } else if ("组装http参数".equalsIgnoreCase(item)) { type = RequestType.ASYN_EASYPARAMS; } else if ("Post内容".equalsIgnoreCase(item)) { type = RequestType.ASYN_EASYPOST; } Intent intent = new Intent(GalHttpRequestDemoActivity.this, RequestActivity.class); intent.putExtra("type", type); startActivity(intent); } }); }
/** * @Title: startRequest * @Description:TODO(这里用一句话描述这个方法的作用) * @param @param type 传入参数名字 * @return void 返回类型 * @date 2012-4-23 下午11:37:16 * @throw */ private void startRequest(int type) { GalHttpRequest request; textView.setVisibility(View.GONE); imageView.setVisibility(View.GONE); switch (type) { case RequestType.SYNC_REQUESTIS: { // 同步请求InputStream title.setText("同步请求InputStream"); request = GalHttpRequest.requestWithURL(this, PATH_INPUTSTREAM); // 如果不检测缓存,则设置: // request.setCacheEnable(false); // 必须在调用startXXX()函数之前设置 // 返回的缓存已经是ufferedInputStream类型 InputStream is = request.startSynchronous(); textView.setVisibility(View.VISIBLE); if (is != null) { textView.setText(is.toString()); } break; } case RequestType.SYNC_REQUESTSTRING: { // 同步请求String title.setText("同步请求String"); request = GalHttpRequest.requestWithURL(this, PATH_STRING); // 根据服务器返回的状态读取内容,如果服务器内容没有改变,则直接读取缓存内容,如果服务器内容已经修改,则从服务器拉取数据 // 并刷新缓存内容 String string = request.startSyncRequestString(); textView.setText(string); textView.setVisibility(View.VISIBLE); break; } case RequestType.SYNC_REQUESTBITMAP: { // 同步请求Bitmap title.setText("同步请求Bitmap"); Header header = new BasicHeader("Accept-Language", "zh-cn,zh;q=0.5"); // 支持添加自定义的Http Header请求 request = GalHttpRequest.requestWithURL(this, PATH_BITMAP, new Header[] { header }); // 请求Bitmap,由于图片基本上不改变,因此如果存在缓存,则直接从缓存读取 Bitmap bitmap = request.startSyncRequestBitmap(); imageView.setImageBitmap(bitmap); imageView.setVisibility(View.VISIBLE); break; } case RequestType.ASYN_REQUESTIS: { // 异步请求InputStream title.setText("异步请求InputStream"); request = GalHttpRequest.requestWithURL(this, PATH_INPUTSTREAM); // 必须先设置回调函数,否则调用异步请求无效 request.setListener(new GalHttpRequestListener() { @Override public void loadFinished(final InputStream is, boolean fromcache) { // 注意,由于返回的是InputStream,一般情况都需要长时间操作,所以,回调函数是在子线程调用 // 因此使用handler handler.post(new Runnable() { @Override public void run() { textView.setText(is.toString()); textView.setVisibility(View.VISIBLE); } }); } @Override // 请求失败时,有可能可以从缓存里面读取数据返回 public void loadFailed(final HttpResponse respone, InputStream cacheInputStream) { handler.post(new Runnable() { @Override public void run() { textView.setText(respone.toString()); textView.setVisibility(View.VISIBLE); } }); } }); request.startAsynchronous(); break; } case RequestType.ASYN_REQUESTSTRING: { title.setText("异步请求String"); // 异步请求String request = GalHttpRequest.requestWithURL(this, PATH_STRING); // 第一次调用startAsynRequestString或者startAsynRequestBitmap必须在主线程调用 // 因为只有在主线程中调用才可以初始化GalHttprequest内部的全局句柄Handler request.startAsynRequestString(new GalHttpLoadTextCallBack() { @Override public void textLoaded(String text) { // 该部分允许于UI线程 textView.setText(text); textView.setVisibility(View.VISIBLE); } }); break; } case RequestType.ASYN_REQUESTBITMAP: { title.setText("异步请求Bitmap"); // 异步请求Bitmap request = GalHttpRequest.requestWithURL(this, PATH_BITMAP); request.startAsynRequestBitmap(new GalHttpLoadImageCallBack() { @Override public void imageLoaded(Bitmap bitmap) { imageView.setImageBitmap(bitmap); imageView.setVisibility(View.VISIBLE); } }); break; } case RequestType.ASYN_EASYPARAMS: { // 异步组装参数 title.setText("组装http参数"); // 交给GalHttprequest自动组装url中的参数 NameValuePair feedPair = new BasicNameValuePair("p", "51"); request = GalHttpRequest.requestWithURL(this, PATH_WITHPARAMS, feedPair); request.startAsynRequestString(new GalHttpLoadTextCallBack() { @Override public void textLoaded(String text) { // 该部分允许于UI线程 textView.setText(text); textView.setVisibility(View.VISIBLE); } }); break; } case RequestType.ASYN_EASYPOST: { // 异步post 数据给服务器 title.setText("异步post 数据给服务器"); // 交给GalHttprequest自动组装url中的参数 request = GalHttpRequest.requestWithURL(this, PATH_POSTCONTENT); // 设置post内容 request.setPostValueForKey("name", "qiuscut"); request.startAsynRequestString(new GalHttpLoadTextCallBack() { @Override public void textLoaded(String text) { // 该部分允许于UI线程 textView.setText("在这里post应该是无效的,因为当前url不支持post"); textView.setVisibility(View.VISIBLE); } }); break; } default: finish(); return; } }