贈送 HttpClient 和HttpURLConnection 的輕型網絡 --》線程池介紹和網絡請求流程
來源:程序員人生 發布時間:2015-01-17 10:01:21 閱讀次數:3583次
轉載注明出處 :http://blog.csdn.net/codingandroid/article/details/41748743
作為1個框架,肯定要去處理1些比較復雜的情況,正常情況下固然不會阻塞,當情況比較復雜的時候,會出現前多個網絡要求的情況,那對這類情況我們規范去管應當然是最好的了,因而我們需要1個線程池。
首先解釋1下,甚么叫線程池 :
每當啟動1個線程的時候,我們通常代碼是 new Thead(){}.start(); new 1個對象 里面又要new1個runnable 這個是相對照較耗時的,資源我們能省就省,這個線程池就相當與說:我保護1個池子,例如里面放5個現成的線程,要求來了也不用重新去new 直接就可以使用,超過5個的時候需要等待1下 對android的開發的來講 就類似于 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 {
/**
* 用于保存等待履行的任務的阻塞隊列。(有序的先進先出阻塞隊列)
*/
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;
}
/**
* 履行任務
* @param r
*/
public void execute(Runnable r) {
mThreadPoolExecutor.execute(r);
}
/**
* 關閉,并等待任務履行完成,不接受新任務
*/
public static void shutdown() {
if (mThreadPoolExecutor != null) {
mThreadPoolExecutor.shutdown();
}
}
/**
* 關閉,立即關閉,并掛起所有正在履行的線程,不接受新任務
*/
public static void shutdownRightnow() {
if (mThreadPoolExecutor != null) {
mThreadPoolExecutor.shutdownNow();
try {
// 設置超時極短,強迫關閉所有任務
mThreadPoolExecutor.awaitTermination(1, TimeUnit.MICROSECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
上1篇中使用的時候有1句代碼 mDefaultThreadPool.execute(asyncBaseRequest);那就是線程池了,不過下面那個是甚么呢?
mAsyncRequests.add(asyncBaseRequest);這行的代碼的作用是 保護當前的 activity的所有的要求,當前頁面關閉的時候,方便結束掉所有的要求
這里面有觸及1個基本的要求類 AsyncBaseRequest 這個類,這個是個要求的基類,在里面我們設定網絡要求的各個流程,和對異常的處理
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;
/**
* 功能描寫:網絡要求線程基類
* @author clxu
* 創建日期:2014⑴2⑷
*/
public abstract class AsyncBaseRequest implements Runnable, Serializable {
private static final long serialVersionUID = 1L;
/** LOG打印標簽*/
private static final String TAG = "AsyncBaseRequest";
/** 網絡連接超時,默許值為10秒*/
protected int connectTimeout = 10 * 1000;
/** 網絡數據讀取超時,默許值為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;
}
/**
* 發送網絡要求
* @return 網絡要求返回的InputStream數據流
* @throws Exception
*/
protected abstract String getRequestResult() throws Exception;
@Override
public void run() {
if (interrupted) {
LogUtil.i(TAG, "訪問網絡前中斷業務處理線程(終止)");
return;
}
try {
//訪問網絡,獲得到返回數據
mInStream = getRequestResult();
if (mInStream != null) {
Object obj = null;
if(parseHandler != null){
//回調 數據解析接口
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); // 網絡要求返回NULL
}
}catch(SocketTimeoutException e){
//SocketTimeoutException 這個超時異常是說明要求已到達
服務器,返回數據進程中超時了,如果是定單類的要求要注意了,需要避免重復提交
ex = new MyException(e);
requestCallback.onFail(ex);
}catch(ConnectTimeoutException e){
//ConnectTimeoutException 這個是連接異常(例如根本沒有打開網絡等情況下),數據還沒有到達
服務器,所以就算是定單類的也沒有關系,可以再次提交
ex = new MyException(e);
requestCallback.onFail(ex);
}catch (TimeoutException e) {
//TimeoutException 這個是總的超時異常,這里還是捕捉1下
ex = new MyException(e);
requestCallback.onFail(ex); // IO異常標識
}catch (HttpHostConnectException e) {
//HttpHostConnectException 出現這個異常,檢查程序是不是添加網絡權限
ex = new MyException(e);
requestCallback.onFail(ex);
}catch (IOException e) {
ex = new MyException(e);
requestCallback.onFail(ex); // IO異常標識
} catch (Exception e) {
ex = new MyException(e);
requestCallback.onFail(ex); // 未知異常標識
}
}
public HttpURLConnection getRequestConn() {
return mHttpURLConn;
}
}
固然,需要兩個接口
package com.clxu.netframe.net.callback;
import org.json.JSONException;
/***
* @function 網絡要求返回的數據解析接口
* @author CLXU
* 2014⑴1⑵5
*/
public interface ParseCallback {
/**
* 對網絡要求返回的數據進行解析
* @param json 要解析的字符串,JSON格式
* @return 解析的結果
* @throws JSONException JSON異常(普通字符串轉換成JSON字符串時,格式出錯會拋此異常)
*/
public Object parse(String json) throws JSONException;
}
package com.clxu.netframe.net.callback;
import com.clxu.netframe.exception.MyException;
/**
* 功能描寫:網絡要求返回的結果回調接口
* <span style="font-family: Arial, Helvetica, sans-serif;">@author CLXU</span>
* 創建日期:2014⑴1⑴9
*/
public interface ResultCallback {
public void onSuccess(Object obj);
public void onFail(MyException e);
}
框架源碼下載地址:http://download.csdn.net/detail/brightshadow11111/8228287
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈