本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