1. 程式人生 > >Android在AsyncHttpClient框架的基礎上定製能直接返回物件陣列的框架

Android在AsyncHttpClient框架的基礎上定製能直接返回物件陣列的框架

以前聽一個大神說過一句借用不知道哪位偉人的話:一個好的方法只有兩三行,每個方法只專注一件事

本著這樣的精神,我們在拉取網路資料的時候希望能將拉取和解析分開,然而我們也希望有這樣一個方法,傳入UIL和表單資料後,能直接返回解析好的物件陣列。所以就有了這樣的一個在AsyncHttpClient框架基礎上定製的框架。由我的小夥伴lwz大神,和打下手的MoblieXu完成。

專案中用的伺服器地址,為自己的小專案中一處拉取JSon,請各位手下留情。

首先看一下,我們希望的結果一個方法傳入引數就能返回解析好的物件陣列:

public class MainActivity extends Activity {
	private TextView tv_showData;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv_showData =(TextView) findViewById(R.id.tv_showData);
		getWebData();
	}

	private void getWebData() {
		GetJournalRequest getJournalRequest = new GetJournalRequest(
				getApplicationContext());
		getJournalRequest.request(new ResponseParseHandler<List<Journal>>() {
					@Override
					public void onStart() {
						//mProgressBar.setVisibility(View.VISIBLE);
					}

					@Override
					public void onSuccess(List<Journal> result) {
//						
					}

					@Override
					public void onFailure(String error, String message) {
						AppContext.showToast(message + "--" + error);
					}
				});
		
	}
}

直接就能從onSuccess回撥中獲取資料,保證了方法的簡潔;

GetJournalRequest.java

public class GetJournalRequest extends
		AbsAsyncHttpRequest<JSONArray, List<Journal>> {

	public static final String KEY_PARAM_JOURNALS = "Journals";

	public GetJournalRequest(Context context) {
		super(context);
	}

	@Override
	public String getAPI() {
		return API.GETJOURNAL_URL;
	}

	@Override
	public HttpMethod getHttpMethod() {
		return HttpMethod.GET;
	}

	@Override
	protected List<Journal> parseEntity(String parseData) throws JSONException {
		List<Journal> data = new ArrayList<Journal>();
		JSONObject jsonObject = new JSONObject(parseData);
		JSONArray jsonArray = jsonObject.getJSONArray(KEY_PARAM_JOURNALS);
		GetJournalParser getJournalParser = new GetJournalParser();
		for (int i = 0; i < jsonArray.length(); i++) {
			data.add(getJournalParser.parse(jsonArray.getJSONObject(i)));
		}
		return CollectionsUtil.isNullOrEmpty(data) ? new ArrayList<Journal>()
				: data;
	}
}

將指向的UIL 和傳遞方式,還有解析Json都定義在這個類中,這個類繼承之AbsAsyncHttpRequest<JSONArray,List<Journal>>

繼承的時候設定了要返回的物件陣列,

public abstract class AbsAsyncHttpRequest<E, T> implements IAsyncHttpRequest<T>  因為都是用泛型所以可以完成上面的設定。

public abstract class AbsAsyncHttpRequest<E, T> implements IAsyncHttpRequest<T> {

	public static final String JSON = "json";
	private Context mContext;
	private HttpRequestParams mParams;
	private ResponseParseHandler<T> mHandler;
	private String mPrefName;
	private String mCacheKey;

	public AbsAsyncHttpRequest(Context context) {
		mContext = context;
	}

	public void setParams(HttpRequestParams params) {
		mParams = params;
	}

	public abstract String getAPI();

	public abstract HttpMethod getHttpMethod();

	public void request(final ResponseParseHandler<T> handler) {
		request(null, null, handler);
	}

	@Override
	public void request(String prefName, String cacheKey,
			final ResponseParseHandler<T> handler) {
		this.mPrefName = prefName;
		this.mCacheKey = cacheKey;
		mHandler = handler;
		mResponse.updatePreNames(mContext,mPrefName, mCacheKey);
		if (getHttpMethod() == HttpMethod.GET) {
			doGet();
		} else {
			doPost();
		}
	}

	private void doGet() {
		if (isParamsEmpty(mParams)) {
			RequestClient.get(getAPI(), mResponse);
		} else {
			RequestClient.get(getUrlWithParams(getAPI(), mParams), mResponse);
		}
	}

	private void doPost() {
		if (isParamsEmpty(mParams)) {
			RequestClient.post(getAPI(), mResponse);
		} else {
			RequestClient.post(getAPI(), mParams.toString(), mResponse);
		}
	}

	private boolean isParamsEmpty(HttpRequestParams params) {
		return params == null || params.isEmpty();
	}

	private String getUrlWithParams(String url, HttpRequestParams params) {
		Set<String> keySet = params.keySet();
		StringBuffer sb = new StringBuffer();
		sb.append("?");
		int i=0;
		for (String key : keySet) {
			i++;
			if(i==keySet.size()){
				sb.append(key + "=" + params.get(key));
			}else{
				sb.append(key + "=" + params.get(key)+"&");
			}
		}
		AppContext.showLog("GET方式URL" + url + sb.toString());
		return url + sb.toString();
	}

	private AsyncHttpResponse mResponse = new AsyncHttpResponse(mContext,
			mPrefName, mCacheKey, new LoadDataHandler() {

				@Override
				public void onStart() {
//					AppContext.showLog("onRequestStart");
					mHandler.onStart();
				}

				@Override
				public void onLoadCaches(String data) {
//					AppContext.showLog("onLoadCaches");
					mHandler.onLoadCaches(parse(data));
				}

				@Override
				public void onSuccess(String data) {
//					AppContext.showLog("成功獲得Json資料" + data);
					mHandler.onSuccess(parse(data));
				}

				@Override
				public void onFinished() {
//					AppContext.showLog("onFinished");
					mHandler.onFinished();
				}

				@Override
				public void onFailure(String error, String message) {
					AppContext.showLog(error + "   " + message);
					mHandler.onFailure(error, message);
				}

			});

	private T parse(String responseData) {
		JSONObject jsonData;
		try {
			jsonData = new JSONObject(responseData);
			BaseResponseParser<String> brp = new BaseResponseParser<String>(
					jsonData);
			if (brp.isSucceed()) {
				return parseEntity(brp.getData());
			} else {
				mHandler.onFailure(brp.getErrorCode(), brp.getErrorMessage());
			}
		} catch (JSONException e) {
			mHandler.onFailure("-1", e.getMessage());
		}
		return null;
	}

	protected abstract T parseEntity(String parseData) throws JSONException;
}
這裡就是繼承之AsyncHttpClient的基礎類IAsyncHttpRequest,關鍵的是獲取到資料之後將資料返回給了藉口方法:

mHandler.onSuccess(parse(data));

private T parse(String responseData) {
		JSONObject jsonData;
		try {
			jsonData = new JSONObject(responseData);
			BaseResponseParser<String> brp = new BaseResponseParser<String>(
					jsonData);
			if (brp.isSucceed()) {
				return parseEntity(brp.getData());
			} else {
				mHandler.onFailure(brp.getErrorCode(), brp.getErrorMessage());
			}
		} catch (JSONException e) {
			mHandler.onFailure("-1", e.getMessage());
		}
		return null;
	}

而parse方法,完成了json最基礎的解析,比如說判斷ret標識,如果資料沒有錯誤的話,那麼執行parseEntity

protected abstract T parseEntity(String parseData) throws JSONException;

這是一個抽象方法,具體的實現是在繼承它的子類裡面實現,所以這樣也就實現了將解析和拉取分開,要解析成什麼物件,由繼承它的類決定,這個parseEntity就像一個鉤子,最後又把解析好的物件陣列返回回來,交給介面mHandler.onSuccess(parse(data));最有趣的是這個介面的實現也就是我們最外面呼叫的

	@Override
public void onSuccess(List<Journal> result) {
//
						}
方法中省略了很多細節,僅僅是簡單分析,有興趣的小夥伴可以到github上拉下來,自己研究一下,有改進的地方,一定提出了。

github:https://github.com/xujinyang/AsyncHttpClientByLX

通過這樣一個框架作為屌絲程式猿的我也能領會到程式設計的美和快樂,何況是大神們尼?






相關推薦

Android在AsyncHttpClient框架基礎定製直接返回物件陣列框架

以前聽一個大神說過一句借用不知道哪位偉人的話:一個好的方法只有兩三行,每個方法只專注一件事。 本著這樣的精神,我們在拉取網路資料的時候希望能將拉取和解析分開,然而我們也希望有這樣一個方法,傳入UIL和表單資料後,能直接返回解析好的物件陣列。所以就有了這樣的一個在AsyncH

一、實現一個特殊的棧,在實現棧的基本功能的基礎,再實現返回棧中最小元素的操作

empty util run print pri ont com res 字符串 請指教交流! 1 package com.it.hxs.c01; 2 3 import java.util.Stack; 4 5 /* 6 實現一個特殊的棧,在實現棧的基本

SSM框架基礎實現國際化/多語言

問題場景:系統的國際化/多語言 簡單demo效果展示:           實現過程 1.搭建SSM框架(參考:https://blog.csdn.net/qq_37918817/articl

linux下基於laravel框架基礎安裝後臺管理系統laravel-admin(1.4)

1,首先需要安裝laravel框架(composer安裝). laravel框架和擴充套件均存放在composer依賴資源庫中,composer類似git庫。所以安裝laravel就必需先安裝composer。 Composer是一個PHP編寫的依賴資源管理器,需要PHP 5.3.2+才能執行(需要開啟o

對於ajax請求,後端不直接返回頁面的處理方式

對於前後端分離的情況下,ajax請求在過濾器和攔截器中,都不能直接返回頁面,那麼應該怎麼處理呢?response.setContentType("application/json; charset=ut

大資料技術學習筆記之Hadoop框架基礎4-MapReduceshuffer過程詳解及zookeeper框架學習

一、MapReduce Shuffle     -》MapReduce執行五個階段         input           

case語句後面不直接建立物件的問題

最近寫程式碼用Switch case語句的時候,老是被case後面不能直接建立物件的問題困擾,在網上搜索了一下,找到了答案,現在整理一下! 方法一:在case後面加花括號  示例程式碼如下 case 2: {             UIImageView *imageV

vo dao dto po的區別(有時候不用實體直接返回給頁面)

在Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念中介紹過Java中的各種模型概念。 在這裡簡單再總結一下: 在日常的專案開發中,VO對應於頁面上需要顯示的資料(表單),DO對應於資料庫中儲存的資料(資料表),DTO對應於除二者之外需要進行傳遞的資料。

update不直接使用select的返回結果

  update不能直接使用select的返回結果,這是會報錯的,這是SQL的語法規定的,若想在update中與select結合使用,sql需要這樣寫:      1.其中field1,field2為表中的欄位名 UPDATE A INNER JOIN(SELECT field1,field2 F

在java Spring基礎實現自定義異常處理框架教程

應用專案大致的體系結構:         該異常處理框架滿足的要求: 完整的異常組織結構異常的統一處理可配置,受管式,方便使用 完整的異常組織結構: 使用者可以方便的定義自己的異常,但所有UncheckedException需要繼承BaseAppRuntimeExce

問題四十九: 現在北京有一套房子,價格200萬,假設房價每年上漲10%( 每年上漲的的價格是在200萬基礎上),一個軟體工程師每年固定賺40萬。 他想買這套房子,不貸款,不吃不喝,幾年後可以買到?

/* 程式頭部註釋開始(為避擴音交博文中遇到的問題,將用於表明註釋的斜槓刪除了) * 程式的版權和版本宣告部分 * All rights reserved. * 檔名稱:

在pring基礎實現自定義異常處理框架教程

應用專案大致的體系結構:         該異常處理框架滿足的要求: 完整的異常組織結構異常的統一處理可配置,受管式,方便使用 完整的異常組織結構: 使用者可以方便的定義自己的異常,但所有UncheckedException

python3下使用map()函式返回導致不直接使用的解決辦法

例如: 在Python3中使用下面的語句,會報錯TypeError: float() argument must be a string or a number, not 'map' np.array(map(float, line.strip().split(' '))

SS2H框架搭建,基礎

 宣告:本文是參照某個培訓機構視訊教程,然後由我自己整理出來的文件,至於是哪個機構就不打廣告了。僅供初學者參考,高手可以不看。  搭建說明:在Myeclipse環境下搭建SS2H框架搭建,包含JUNIT單元測試。在搭建環境前得先建立一個web project工程,本人

安卓4.4以前不直接呼叫js獲取返回值,解決方法

安卓4.4以前用類似這種呼叫js獲得返回資料 webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() { @Override public void onRec

IE中使用google的搜尋程式時總是先彈出“檢視在google.com.hk的搜尋結果”頁面,如何讓其直接返回搜尋結果?

眾所周知,自從Google退出中國以後,之前Google.cn的內容都重定向到Google.com.hk了。而我們在Internet Explorer庫網站裡面新增Google載入項為預設搜尋引擎以後,搜尋的結果卻還是

EasyBCD在windows7基礎安裝Ubuntu 14.04雙系統詳

-1 spl tools 是把 步驟 not 安裝包 utf 復制 把下載好的ubuntu安裝包放在C盤根文件夾下,利用Daemon Tools 將安裝包下casper文件夾的vmlinuz.efi和initrd.lz復制到C盤根文件夾下,緊接著打開easybcd,在配

(轉)Hibernate框架基礎——多對多關聯關系映射

-- 否則 del 畫圖 兩個 delete pub attribute cnblogs http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多對多關聯關系映射 多對多的實體關系模型也是很常見的,比如學

Django框架基礎之COOKIE

display 裝飾器 根路徑 wsgi and close 方式 signed span cookie: a. 保存在瀏覽器端“鍵值對” b. 服務端可以向用戶瀏覽器端寫cookie c. 客戶端每次方請求時,會攜

淺入深出之Java集合框架

不重復 系統 left 子類 log 兩個 示例 c語言 重要 Java中的集合框架(上) 由於Java中的集合框架的內容比較多,在這裏分為三個部分介紹Java的集合框架,內容是從淺到深,如果已經有java基礎的小夥伴可以直接跳到<淺入深出之Java集合框架(下)&