多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > 綜合技術(shù) > 贈送 HttpClient 和HttpURLConnection 的輕型網(wǎng)絡(luò) --》線程池介紹和網(wǎng)絡(luò)請求流程

贈送 HttpClient 和HttpURLConnection 的輕型網(wǎng)絡(luò) --》線程池介紹和網(wǎng)絡(luò)請求流程

來源:程序員人生   發(fā)布時間:2015-01-17 10:01:21 閱讀次數(shù):3578次

轉(zhuǎn)載注明出處 :http://blog.csdn.net/codingandroid/article/details/41748743


作為1個框架,肯定要去處理1些比較復(fù)雜的情況,正常情況下固然不會阻塞,當(dāng)情況比較復(fù)雜的時候,會出現(xiàn)前多個網(wǎng)絡(luò)要求的情況,那對這類情況我們規(guī)范去管應(yīng)當(dāng)然是最好的了,因而我們需要1個線程池。

首先解釋1下,甚么叫線程池  :

每當(dāng)啟動1個線程的時候,我們通常代碼是   new Thead(){}.start();  new 1個對象 里面又要new1個runnable 這個是相對照較耗時的,資源我們能省就省,這個線程池就相當(dāng)與說:我保護(hù)1個池子,例如里面放5個現(xiàn)成的線程,要求來了也不用重新去new 直接就可以使用,超過5個的時候需要等待1下    對android的開發(fā)的來講  就類似于 soundpool吧

理解這個就好,代碼沒幾行,放上來哦

package com.clxu.netframe.abstractinterface; import java.util.concurrent.AbstractExecutorService; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /*** * @function 線程池 * @author CLXU * * 2014⑴1⑵5 */ public class DefaultThreadPool { /** * 用于保存等待履行的任務(wù)的阻塞隊列。(有序的先進(jìn)先出阻塞隊列) */ private static ArrayBlockingQueue<Runnable> mBlockingQueue = new ArrayBlockingQueue<Runnable>(15, true); /** * 線程池 */ private static AbstractExecutorService mThreadPoolExecutor = new ThreadPoolExecutor(5, 7, 25, TimeUnit.SECONDS, mBlockingQueue, new ThreadPoolExecutor.DiscardOldestPolicy()); private static DefaultThreadPool instance = null; public static DefaultThreadPool getInstance() { if (instance == null) { instance = new DefaultThreadPool(); } return instance; } /** * 履行任務(wù) * @param r */ public void execute(Runnable r) { mThreadPoolExecutor.execute(r); } /** * 關(guān)閉,并等待任務(wù)履行完成,不接受新任務(wù) */ public static void shutdown() { if (mThreadPoolExecutor != null) { mThreadPoolExecutor.shutdown(); } } /** * 關(guān)閉,立即關(guān)閉,并掛起所有正在履行的線程,不接受新任務(wù) */ public static void shutdownRightnow() { if (mThreadPoolExecutor != null) { mThreadPoolExecutor.shutdownNow(); try { // 設(shè)置超時極短,強迫關(guān)閉所有任務(wù) mThreadPoolExecutor.awaitTermination(1, TimeUnit.MICROSECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } } }




上1篇中使用的時候有1句代碼   mDefaultThreadPool.execute(asyncBaseRequest);那就是線程池了,不過下面那個是甚么呢?


mAsyncRequests.add(asyncBaseRequest);這行的代碼的作用是 保護(hù)當(dāng)前的 activity的所有的要求,當(dāng)前頁面關(guān)閉的時候,方便結(jié)束掉所有的要求


這里面有觸及1個基本的要求類   AsyncBaseRequest 這個類,這個是個要求的基類,在里面我們設(shè)定網(wǎng)絡(luò)要求的各個流程,和對異常的處理

package com.clxu.netframe.abstractinterface; import java.io.IOException; import java.io.Serializable; import java.net.HttpURLConnection; import java.net.SocketTimeoutException; import java.util.Map; import java.util.concurrent.TimeoutException; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.conn.HttpHostConnectException; import com.clxu.netframe.R; import com.clxu.netframe.constant.Constant; import com.clxu.netframe.exception.MyException; import com.clxu.netframe.net.callback.ParseCallback; import com.clxu.netframe.net.callback.ResultCallback; import com.clxu.netframe.util.LogUtil; /** * 功能描寫:網(wǎng)絡(luò)要求線程基類 * @author clxu * 創(chuàng)建日期:2014⑴2⑷ */ public abstract class AsyncBaseRequest implements Runnable, Serializable { private static final long serialVersionUID = 1L; /** LOG打印標(biāo)簽*/ private static final String TAG = "AsyncBaseRequest"; /** 網(wǎng)絡(luò)連接超時,默許值為10秒*/ protected int connectTimeout = 10 * 1000; /** 網(wǎng)絡(luò)數(shù)據(jù)讀取超時,默許值為10秒*/ protected int readTimeout = 10* 1000; private boolean interrupted; public boolean isInterrupted() { return interrupted; } public void setInterrupted(boolean interrupted) { this.interrupted = interrupted; } protected void setConnectTimeout(int connectTimeout) { this.connectTimeout = connectTimeout; } protected void setReadTimeout(int readTimeout) { this.readTimeout = readTimeout; } protected String requestUrl; protected Map<String, String> parameter; private ParseCallback parseHandler; private ResultCallback requestCallback; protected HttpURLConnection mHttpURLConn; protected String mInStream; private MyException ex; public AsyncBaseRequest(String url, Map<String, String> parameter, ParseCallback handler, ResultCallback requestCallback) { this.parseHandler = handler; this.requestUrl = url; this.parameter = parameter; this.requestCallback = requestCallback; } /** * 發(fā)送網(wǎng)絡(luò)要求 * @return 網(wǎng)絡(luò)要求返回的InputStream數(shù)據(jù)流 * @throws Exception */ protected abstract String getRequestResult() throws Exception; @Override public void run() { if (interrupted) { LogUtil.i(TAG, "訪問網(wǎng)絡(luò)前中斷業(yè)務(wù)處理線程(終止)"); return; } try { //訪問網(wǎng)絡(luò),獲得到返回數(shù)據(jù) mInStream = getRequestResult(); if (mInStream != null) { Object obj = null; if(parseHandler != null){ //回調(diào) 數(shù)據(jù)解析接口 obj = parseHandler.parse(mInStream); } if(requestCallback!=null){ requestCallback.onSuccess(obj); } } else { LogUtil.e(TAG, "get InputStream By HttpURLConnection return result is NULL."); ex = new MyException(R.string.network_request_fail, Constant.NETWORK_REQUEST_RETUN_NULL, R.string.network_request_return_null); requestCallback.onFail(ex); // 網(wǎng)絡(luò)要求返回NULL } }catch(SocketTimeoutException e){ //SocketTimeoutException 這個超時異常是說明要求已到達(dá)服務(wù)器,返回數(shù)據(jù)進(jìn)程中超時了,如果是定單類的要求要注意了,需要避免重復(fù)提交 ex = new MyException(e); requestCallback.onFail(ex); }catch(ConnectTimeoutException e){ //ConnectTimeoutException 這個是連接異常(例如根本沒有打開網(wǎng)絡(luò)等情況下),數(shù)據(jù)還沒有到達(dá)服務(wù)器,所以就算是定單類的也沒有關(guān)系,可以再次提交 ex = new MyException(e); requestCallback.onFail(ex); }catch (TimeoutException e) { //TimeoutException 這個是總的超時異常,這里還是捕捉1下 ex = new MyException(e); requestCallback.onFail(ex); // IO異常標(biāo)識 }catch (HttpHostConnectException e) { //HttpHostConnectException 出現(xiàn)這個異常,檢查程序是不是添加網(wǎng)絡(luò)權(quán)限 ex = new MyException(e); requestCallback.onFail(ex); }catch (IOException e) { ex = new MyException(e); requestCallback.onFail(ex); // IO異常標(biāo)識 } catch (Exception e) { ex = new MyException(e); requestCallback.onFail(ex); // 未知異常標(biāo)識 } } public HttpURLConnection getRequestConn() { return mHttpURLConn; } }

固然,需要兩個接口

package com.clxu.netframe.net.callback; import org.json.JSONException; /*** * @function 網(wǎng)絡(luò)要求返回的數(shù)據(jù)解析接口 * @author CLXU * 2014⑴1⑵5 */ public interface ParseCallback { /** * 對網(wǎng)絡(luò)要求返回的數(shù)據(jù)進(jìn)行解析 * @param json 要解析的字符串,JSON格式 * @return 解析的結(jié)果 * @throws JSONException JSON異常(普通字符串轉(zhuǎn)換成JSON字符串時,格式出錯會拋此異常) */ public Object parse(String json) throws JSONException; }

package com.clxu.netframe.net.callback; import com.clxu.netframe.exception.MyException; /** * 功能描寫:網(wǎng)絡(luò)要求返回的結(jié)果回調(diào)接口 * <span style="font-family: Arial, Helvetica, sans-serif;">@author CLXU</span> * 創(chuàng)建日期:2014⑴1⑴9 */ public interface ResultCallback { public void onSuccess(Object obj); public void onFail(MyException e); }


框架源碼下載地址:http://download.csdn.net/detail/brightshadow11111/8228287



生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 日韩精品一区二区三区视频 | 人阁色第四影院在线观看 | 欧美午夜春性猛交xxxx | 免费观看欧美成人1314w色 | 小说区图片区综合久久亚洲 | 国产小网站 | 欧美日韩一区二区三区视频在线观看 | 天堂在线亚洲 | 亚洲春色视频 | 成人卡通精品卡通动漫第一页 | free性欧美69式| 手机看片国产欧美日韩高清 | xxx性欧美人 | 亚洲和欧美毛片久久久久 | 黄色小说校园春色 | 国产小情侣激情小视频免费看 | 成人a视频| 高清欧美一级在线观看 | 在线观看麻豆 | 免费观看在线永久免费xx视频 | 成人中文字幕在线观看 | 亚洲伊人精品 | 99一级毛片 | 欧美性高清bbbbbbxxxxx | 国产福利一区二区精品免费 | 欧美一级视频在线高清观看 | 韩国三级一线观看久 | 一区二区国产在线播放 | jizz日本护士视频 | 日韩爱爱小视频 | 久久精品免费一区二区三区 | 东京干男人都知道的网站 | 国产亚洲福利精品一区 | 久久天天躁狠狠躁夜夜躁 | 东北普通话清晰对白 | 日韩欧美成人乱码一在线 | 亚洲在线播放视频 | 久久精品视频一区 | 国产一区二区三区在线免费观看 | 中文字幕在线日本 | 国产精品任我爽爆在线播放66 |