zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Codeforces Round #485 (Div. 2) C题求三元组(思维)
    MongoDB设置访问权限、设置用户
    与MySQL交互(felixge/node-mysql)
    centos Supervisor
    Async详解之一:流程控制
    C# Socket连接请求超时机制
    tcp-client-c++
    C#TCPClient应用-一个简单的消息发送和接收
    centos下各种c++库文件的安装
    AngularJS与RequireJS集成方案
  • 原文地址:https://www.cnblogs.com/zx-blog/p/11835843.html
Copyright © 2011-2022 走看看