android http 多请求异步封装对你绝对有用
本demo主要对异步请求封装 本博客链接地址:http://blog.csdn.net/vpingchangxin/article/details/23375461 可用作基本项目框架来使用 网络请求等等小细节已经ok 如有需要请进一步更改 1)封装HttpClient 2)由于用到线程池,可以进行多任务网络请求操作 3)没有网络的时候进行网络状态检查 4)对请求的数据根据URL进行缓存到本地sqlite数据库中(我刚刚想起了 post请求的时候需要对缓存url及本地数据存取做修改才可以正常用 如果不想进行修改可以用get形式) 5)本demo可以直接运行 本来想测试protobuf进行数据处理的 要放在github上就改成json了(entity中有简单的xml解析:Menu.java 其他的都是json的 json 也可用Gson更方便) 先介绍下流程图 1)主要核心代码 AnsynHttpRequest.java 主要对 http暴露get post 调用方法 在内部中使用ThreadPoolExecutor线程池并开放公共异步方 法进行post、get进行网络请求 [java] view plaincopy /** * * 访问网络初始化函数 支持GET请求方式 * * @param callBack 回调执行函数 支持线程 * @param url 每个执行url * @param map 参数 * @param isCache 是否本地缓存 * @param isShowDialog 是否弹出提示等待框 */ public static void requestByGet(Context context, final ObserverCallBack callBack, int url, Map<String, String> map, boolean isCache, boolean isShowDialog) { //组织URL 及判断网络处理 省略 。。。。 // 异步请求数据 doAsynRequest(GET, null ,context, callBack, requestUrl, isCache, isShowDialog, url); } /** * 异步请求网络数据 * * @param sendType 请求类型 * @param map 参数 * @param context * @param callBack 回调对象 * @param url * @param isCache 是否缓存 * @param isShowDialog 是否有提示框 * @param intUrl */ private static void doAsynRequest(final int sendType, final Map<String, String> map, final Context context, final ObserverCallBack callBack, final String url, final boolean isCache, final boolean isShowDialog, final int intUrl) { if(isShowDialog) ((Activity)context).showDialog(1); // 加载对话框提示等待。。 // 请求 ThreadPoolUtils.execute(new MyRunnable(sendType, map, context, callBack, url, isCache, isShowDialog, intUrl)); } /** * * 访问网络初始化函数 支持Post请求方式 * * @param context * @param http_head 请求头传null或者在C.http类中配置 * @param callBack 回调执行函数 支持线程 * @param url 每个执行url * @param map 参数 * @param isCache 是否本地缓存 * @param isShowDialog 是否弹出提示等待框 */ public static void requestByPost(Context context,String http_head, final ObserverCallBack callBack, int url, Map<String, String> map, boolean isCache, boolean isShowDialog) { //组织URL及判断网络处理 省略 。。。。 // 异步请求数据 doAsynRequest(POST, map ,context, callBack, requestUrl, isCache, isShowDialog, url); } 2)ThreadPoolUtils.java 线程池类在网上找的直接用了 具体不解释了 [java] view plaincopy package com.vic.http.utils; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** * 线程池辅助类,整个应用程序就只有一个线程池去管理线程。 可以设置核心线程数、最大线程数、额外线程空状态生存时间,阻塞队列长度来优化线程池。 * 下面的数据都是参考Android的AsynTask里的数据。 * * @author zet * */ public class ThreadPoolUtils { private ThreadPoolUtils() { } // 线程池核心线程数 private static int CORE_POOL_SIZE = 5; // 线程池最大线程数 private static int MAX_POOL_SIZE = 100; // 额外线程空状态生存时间 private static int KEEP_ALIVE_TIME = 10000; // 阻塞队列。当核心线程都被占用,且阻塞队列已满的情况下,才会开启额外线程。 private static BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>( 10); // 线程工厂 private static ThreadFactory threadFactory = new ThreadFactory() { private final AtomicInteger integer = new AtomicInteger(); @Override public Thread newThread(Runnable r) { return new Thread(r, "myThreadPool thread:" + integer.getAndIncrement()); } }; // 线程池 private static ThreadPoolExecutor threadPool; static { threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, workQueue, threadFactory); } /** * 从线程池中抽取线程,执行指定的Runnable对象 * * @param runnable */ public static void execute(Runnable runnable) { threadPool.execute(runnable); } } 3)在ActivityUI线程中调用方式(可以支持多个url请求同时执行因为异步请求方法中用了线程池进行调度你懂的) [java] view plaincopy // by get map = new HashMap<String, String>(); // map.put("method", "adv_list"); // map.put("regionid", "320200"); AnsynHttpRequest.requestByGet(context, callbackData, C.http.http_adv, map, true, true); // by post map = new HashMap<String, String>(); map = new MapData().addData(map, context); AnsynHttpRequest.requestByPost(context, C.http.http_test_bb,callbackData, C.http.http_area, map, false, false); // http初始化 map = new HashMap<String, String>(); // map.put("method", "businesscategory_list"); AnsynHttpRequest.requestByPost(context, C.http.http_test_cc,callbackData, C.http.http_area, map, false, false); 4)回调函数及handler进行UI线程中更新数据处理 [java] view plaincopy /** * 异步回调回来并处理数据 */ private ObserverCallBack callbackData = new ObserverCallBack(){ public void back(String data, int url) { switch (url) { case C.http.http_area: // 进行数据解析 if(data == null) { return; } try { // Index index = new Index(); // index = index.convertHttpHead(context,data); //// App.index = index; // Log.i(tag, index.toString()); Message msg = new Message(); msg.what = 1; // msg.obj = index; mHandler.sendMessage(msg); } catch (Exception e) { e.printStackTrace(); } break; default: Message msg = new Message(); msg.what = url; mHandler.sendMessage(msg); break; } } }; /** * 处理UI线程中数据 */ private Handler mHandler = new Handler() { public void handleMessage(Message msg) { Intent intent = null; switch (msg.what) { case 1: Toast.makeText(context, "测试数据 数据编号:"+msg.what, Toast.LENGTH_SHORT).show(); break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: // setListViewHeightBasedOnChildren(mListView); // setListViewHeightBasedOnChildren(mListView); break; case 8: // Bitmap bmp = (Bitmap)msg.obj; // SendMsg.weixin(context, mCategory, bmp); break; default: Toast.makeText(context, "测试数据 数据编号:"+msg.what, Toast.LENGTH_SHORT).show(); break; } }; }; 5)demo 中也有对网络是否通畅进行判断及封装 具体看demo吧 感觉有用的必须顶一下哟 谢谢搜看 好了最后附上代码github链接:https://github.com/pingchangxin/android_http_ansyn_packaging csdn下载链接:http://download.csdn.net/detail/vpingchangxin/7173687