使用场景
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();
}
});
}
}
结果
AS完整代码:
点击打开链接