对Android官方网络框架——volley的封装

使用场景

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完整代码: 点击打开链接

猜你喜欢

转载自blog.csdn.net/qq_14902389/article/details/53379465
今日推荐