1. 程式人生 > >對Android官方網路框架——volley的封裝

對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();
            }
        });
    }
}

結果