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, truetrue);  
  
        // 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, falsefalse);  
  
        // 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, falsefalse);  

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

 

android http 多请求异步封装对你绝对有用

上一篇:Hbulder 调试安卓app


下一篇:org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplic