對Android官方網路框架——volley的封裝
阿新 • • 發佈:2019-01-30
使用場景
Android系統中主要提供了兩種方式來進行HTTP通訊,HttpURLConnection和HttpClient,幾乎在任何專案的程式碼中我們都能看到這兩個類的身影,使用率非常高。不過HttpURLConnection和HttpClient的用法還是稍微有些複雜的,如果不進行適當封裝的話,很容易就會寫出不少重複程式碼。官方也提供了volley這樣的網路框架,可能很多人都已經開始用鴻洋大神的OKHTTP了?好吧,萬變不離其宗。感覺沒什麼區別,volley用習慣了,暫時也不打算換~~封裝步驟
匯入 volley 和gson
compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28'
compile 'com.google.code.gson:gson:2.3'
直接上關鍵程式碼(尾部有完整demo)
;
public class MyVolley { private static RequestQueue mRequestQueue; private MyVolley() { // no instances } public static void init(Context context) { mRequestQueue = Volley.newRequestQueue(context); int memClass = ((ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass(); } public static RequestQueue getRequestQueue() { if (mRequestQueue != null) { return mRequestQueue; } else { throw new IllegalStateException("RequestQueue not initialized"); } } public static void addRequestQueue(Request request) { request.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1, 1.0f)); getRequestQueue().add(request); } }
/** * HTTP請求的基類 */ public class BaseAction<T> implements Response.Listener<T>, Response.ErrorListener { private static final String TAG = "BaseAction"; protected int mRequestId; //成功進行網路請求的回撥 protected NetworkListener.Succeed<T> mSucceedListener; //失敗的回撥 protected NetworkListener.Error mErrorListener; // private boolean mIsBindFragment; private Fragment mBindFragment; private boolean mIsBindActivity; private Activity mBindActivity; private WebRequstLoad mWebRequstLoad; public BaseAction() { } public void setWebRequstLoad(WebRequstLoad mWebRequstLoad) { this.mWebRequstLoad = mWebRequstLoad; } public int getRequestId() { return mRequestId; } public void setRequestId(int requestId) { mRequestId = requestId; } public void bindFragment(Fragment fragment) { mIsBindFragment = true; mBindFragment = fragment; } public void bindActivity(Activity activity) { mIsBindActivity = true; mBindActivity = activity; } public void setErrorListener(NetworkListener.Error mErrorListener) { this.mErrorListener = mErrorListener; } public void setSucceedListener(NetworkListener.Succeed<T> mSucceedListener) { this.mSucceedListener = mSucceedListener; } @Override public void onResponse(T o) { if (mWebRequstLoad != null) { mWebRequstLoad.onSuccess(); } if (mSucceedListener == null) { return; } if (mIsBindFragment && !mBindFragment.isAdded()) { //如果fragment被銷燬則不傳遞資料給fragment return; } // try { // WebRequestResult result = (WebRequestResult) o; // boolean login = result.isLogin(); // } catch (ClassCastException e) { // Log.e("***************",e.toString()); // } mSucceedListener.onRequestSucceed(o); } @Override public void onErrorResponse(VolleyError volleyError) { Log.i(TAG, volleyError.toString()); if (mWebRequstLoad != null) { mWebRequstLoad.onError(); } if (null != mErrorListener) { mErrorListener.onErrorHappened("1", volleyError.toString()); return; } } public T getCache(String url, Class<T> classOfT) { RequestQueue queue = MyVolley.getRequestQueue(); if (null != queue.getCache().get(url)) { String cachedResponse = new String(queue.getCache().get(url).data); Log.i("BaseAction", "cache -> " + cachedResponse); T data = new Gson().fromJson(cachedResponse, classOfT); return data; } return null; } protected <T1> void addRequestQueue(Request<T1> request) { request.setTag(this.getClass().getCanonicalName()); request.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1, 1.0f)); MyVolley.getRequestQueue().add(request); } public void stop() { Log.i("取消請求 -> " + this.getClass().getCanonicalName(), ""); MyVolley.getRequestQueue().cancelAll(this.getClass().getCanonicalName()); } public void startLoad() { if (mWebRequstLoad != null) { mWebRequstLoad.onLoding(); } }
使用
/**
* 網上隨便找了個url做個演示
* http://v.juhe.cn/xiangji_weather/real_time_weather.php?areaid=101010100&key=YOURKEY
*/
public class WeatherAction extends BaseAction<Weather> {
//是否是快取資料
private boolean mIsCache;
private String url = "http://v.juhe.cn/xiangji_weather/real_time_weather.php?areaid=101010100&key=YOURKEY";
@Override
public void startLoad() {
super.startLoad();
GsonRequest<Weather> jr = new GsonRequest<Weather>(url, Weather.class, this, this);
addRequestQueue(jr);
}
//獲取快取
public void startLoadWithCache() {
RequestQueue queue = MyVolley.getRequestQueue();
if (null != queue.getCache().get(url)) {
String cachedResponse = new String(queue.getCache().get(url).data);
Log.i("Action Cache", cachedResponse);
Weather data = new Gson().fromJson(cachedResponse, Weather.class);
onResponse(data);
mIsCache = true;
}
}
activity中
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private WeatherAction mAction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
initWebRequst();
}
private void initWebRequst() {
//初始化volley 要在appliction中設定 這邊做個演示
MyVolley.init(this);
mAction = new WeatherAction();
mAction.setSucceedListener(new NetworkListener.Succeed<Weather>() {
@Override
public void onRequestSucceed(Weather data) {
//成功的回撥
mTextView.setText(data.getReason());
}
});
mAction.setErrorListener(new NetworkListener.Error() {
@Override
public void onErrorHappened(String errorCode, String errorMessage) {
//失敗的
}
});
setWebRequstLoding(mAction);
}
private void initViews() {
mTextView = (TextView) findViewById(R.id.textview);
}
//按鈕點選事件
void start(View v) {
mAction.startLoad();
}
//設定載入動畫 可以根據需要來確定是否加入 /可以寫在activity的基類中,確保複用性
public void setWebRequstLoding(BaseAction action) {
final LoadeDialog dialog = new LoadeDialog(this);
action.setWebRequstLoad(new WebRequstLoad() {
@Override
public void onLoding() {
dialog.show();
}
@Override
public void onSuccess() {
dialog.dismiss();
}
@Override
public void onError() {
dialog.dismiss();
}
});
}
}
結果