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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM