【FastDev4Android框架開發】Volley完全解析之進階最佳實踐與二次封裝(二十七)

轉載請標明出處:

http://blog.csdn.net/developer_jiangqq/article/details/49804487

本文出自:【江清清的博客】

().前言:   

         【好消息】個人網站已經上線運行,後面博客以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org 

        上一講我們已經對Volley使用基礎階段涉及到字符串,JSON,圖片等等網絡數據請求相關方法的使用。今天我們對於Volley框架來一個進階使用擴展封裝,以及對上一篇遺留的問題做一下具體修改使用。主要涉及新增GsonRequest,ImageLoader列表圖片加載,ImageCache,Volley框架StringRequest二次封裝以及post請求新增設置請求參數方法。

        FastDev4Android框架項目地址:https://github.com/jiangqqlmj/FastDev4Android

().post請求擴展請求參數方法

       還記得前面文章我們只是使用RequestGET請求方法,當然作爲完善的網絡框架POST請求必須支持,不過很可惜的是Volley框架沒有給我們顯示的提供設置POST請求參數的方法,不過我們有兩種方法來進行設置。不過在做之前我們需要先從源碼角度來分析一下。

        查看源碼,我們發現Volley請求最終會被封裝成HttpRequest子類對象HttpUrlRequest,該方法在HttpClientStack中的createHttpRequest()方法,代碼和相關注釋如下:

/**
     * 進行創建httprequest,這邊獲取httprequest的子類,httpurlrequest
     * Creates the appropriate subclass ofHttpUriRequest for passed in request.
     */
    @SuppressWarnings("deprecation")
    /* protected */ static HttpUriRequest createHttpRequest(Request<?> request,
            Map<String, String>additionalHeaders) throws AuthFailureError {
        switch (request.getMethod()) {
            case Method.DEPRECATED_GET_OR_POST:{
                // This is the deprecated waythat needs to be handled for backwards compatibility.
                // If the request's post bodyis null, then the assumption is that the request is
                // GET.  Otherwise, it is assumed that the request isa POST.
                byte[] postBody =request.getPostBody();
                if (postBody != null) {
                    HttpPost postRequest = new HttpPost(request.getUrl());
                    postRequest.addHeader(HEADER_CONTENT_TYPE,request.getPostBodyContentType());
                    HttpEntity entity;
                    entity = new ByteArrayEntity(postBody);
                   postRequest.setEntity(entity);
                    return postRequest;
                } else {
                    return newHttpGet(request.getUrl());
                }
            }
            case Method.GET:
                return newHttpGet(request.getUrl());
            case Method.DELETE:
                return newHttpDelete(request.getUrl());
            case Method.POST: {
                HttpPost postRequest = new HttpPost(request.getUrl());
               postRequest.addHeader(HEADER_CONTENT_TYPE,request.getBodyContentType());
                //設置請求體 body信息 -如果請求體不爲空---[注意]
               setEntityIfNonEmptyBody(postRequest, request);
                return postRequest;
            }
            case Method.PUT: {
                HttpPut putRequest = new HttpPut(request.getUrl());
               putRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());
               setEntityIfNonEmptyBody(putRequest, request);
                return putRequest;
            }
            case Method.HEAD:
                return new HttpHead(request.getUrl());
            case Method.OPTIONS:
                return new HttpOptions(request.getUrl());
            case Method.TRACE:
                return new HttpTrace(request.getUrl());
            case Method.PATCH: {
                HttpPatch patchRequest = newHttpPatch(request.getUrl());
               patchRequest.addHeader(HEADER_CONTENT_TYPE,request.getBodyContentType());
               setEntityIfNonEmptyBody(patchRequest, request);
                return patchRequest;
            }
            default:
                throw newIllegalStateException("Unknown request method.");
        }
    }

注意查看以上caseMethod.POST部分中的setEntityIfNonEmptyBody();中進行設置請求體相關數據:

 /**
     * 如果request的請求體不爲空,進行設置請求體信息
     * @param httpRequest
     * @param request
     * @throws AuthFailureError
     */
    private static void setEntityIfNonEmptyBody(HttpEntityEnclosingRequestBase httpRequest,
            Request<?> request) throws AuthFailureError {
        byte[] body = request.getBody();
        if (body != null) {
            HttpEntity entity = new ByteArrayEntity(body);
            httpRequest.setEntity(entity);
        }
    }
然後會執行RequestgetBody()方法來獲取請求體。

/**
     * Returns the raw POST or PUT body to besent.
     * 如果請求是POST或者PUT方法,去獲取請求參數信息,然後設置到請求中
     * <p>By default, the body consistsof the request parameters in
     * application/x-www-form-urlencodedformat. When overriding this method, consider overriding
     * {@link #getBodyContentType()} as well tomatch the new body format.
     *
     * @throws AuthFailureError in the event ofauth failure
     */
    public byte[] getBody() throws AuthFailureError {
        //獲取請求參數信息
        Map<String, String> params =getParams();
        if (params != null &¶ms.size() > 0) {
            return encodeParameters(params,getParamsEncoding());
        }
        return null;
    }

最後會獲取XxxRequest的基類Requst類中的getParams()來獲取請求參數信息,然後設置進去。

OK這個設置POST請求參數信息的流程大家應該能清楚吧。但是Volley源代碼這邊就直接返回null,如下:

protected Map<String, String> getParams() throws AuthFailureError {
        return null;
    }

又因爲Volley是開源的,那麼下面我們開源對Request和XxxRequest類進行改造修改源代碼,往外提供POST請求參數設置的方法,修改步驟如下:

        2.1.Request類一個Map對象mParams,然後添加set方法,然後在getParams()進行returnmParams。具體修改如下:

/**
     * 自定義修改 新增POST請求參數map
     */
    protected Map<String,String> mParams=null;
    public void setParams(Map<String,String> params) {
        this.mParams = params;
    }

/**
     * 進行獲取post請求參數數據
     * Returns a Map of parameters to be usedfor a POST or PUT request.  Can throw
     * {@link AuthFailureError} asauthentication may be required to provide these values.
     *
     * <p>Note that you can directlyoverride {@link #getBody()} for custom data.</p>
     *
     * @throws AuthFailureError in the event ofauth failure
     */
    protected Map<String, String> getParams() throws AuthFailureError {
        //return null;
        //重新進行返回params
        return mParams;
    }

       2.2.間接着我們對StringRequest類進行擴展一個構造方法,加入請求參數Map對象,具體代碼如下:

/**
     * 擴展POST請求構造函數
     * @param url 請求地址
     * @param listener   數據請求加載成功監聽器
     * @param errorListener  數據請求加載失敗監聽器
     * @param params  POST請求參數
     */
    public StringRequest(String url,Listener<String> listener, ErrorListenererrorListener,Map<String,String> params) {
        this(Method.POST, url, listener,errorListener);
        //進行初始化Request中post 請求參數
        setParams(params);
    }

   OK這兩步修改就完成了POST請求參數設置擴展,下面我們來一看一下具體使用方法:

RequestQueue requestQueue=Volley.newRequestQueue(this);
              //修改Volley源代碼,擴展StringRequest支持post參數設置
                Map<String,String>params=new HashMap<String,String>();
               params.put("username","zhangsan");
               params.put("password","12345");
                StringRequest post_stringRequest=new StringRequest("http://10.18.3.123:8080/SalesWebTest/TestVolleyPost",new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                       tv_result.setVisibility(View.VISIBLE);
                       img_result.setVisibility(View.GONE);
                       tv_result.setText(response.toString());
                    }
                }, new Response.ErrorListener(){
                    @Override
                    public void onErrorResponse(VolleyError error) {
 
                    }
                },params);
               requestQueue.add(post_stringRequest)

       這樣就完成POST請求參數設置的擴展,另外的一種方案是創建StringRequest對象的時候實匿名類中重寫getParams()方法,然後構造Map對象設置參數信息return該對象即可。不過個人覺的這種方案不推薦還是使用設置的方法比較好。

().ImageloaderImageCache

      在前面使用ImageLoder對象加載圖片的時候,有一個優點我們沒有深入講解,因爲ImageLoader是支持緩存功能,所以我們在創建ImageLoader需要傳入一個緩存管理器,裏面傳入我們自定義的緩存策略,Fdv_ImageCache我們這邊引入LruCache算法具體實現如下:

packagecom.chinaztt.fdv;
importandroid.graphics.Bitmap;
importandroid.util.LruCache;
importcom.android.volley.toolbox.ImageLoader;
/**
 * 當前類註釋:圖片緩存器,實現ImageLoder.ImageCache實現其中的方法,具體圖片怎麼樣緩存讓我們自己來實現
 * 這樣可以考慮到將來的擴展性
 * 項目名:FastDev4Android
 * 包名:com.chinaztt.fdv
 * 作者:江清清 on 15/11/12 12:31
 * 郵箱:[email protected]
 * QQ: 781931404
 * 公司:江蘇中天科技軟件技術有限公司
 */
public class Fdv_ImageCache  implements ImageLoader.ImageCache {
    private LruCache<String, Bitmap>mCache=null;
    private static final intCACHE_MAX_SIZE = 8 * 1024 * 1024;  //默認緩存大小爲8M
    public Fdv_ImageCache(){
        if(mCache==null){
            mCache = new LruCache<String,Bitmap>(CACHE_MAX_SIZE) {
                @Override
                protected int sizeOf(Stringkey, Bitmap bitmap) {
                    return bitmap.getRowBytes()* bitmap.getHeight();
                }
            };
        }
    }
    /**
     * 從緩存中獲取圖片
     * @param url  獲取圖片key  當然該key可以根據實際情況 使用url進行變換修改
     * @return
     */
    @Override
    public Bitmap getBitmap(String url) {
        return mCache.get(url);
    }
    /**
     * 向緩存中添加圖片
     * @param url  緩存圖片key,當然該key可以根據實際情況 使用url進行變換修改 不過規格需要和上面方法的key保持一致
     * @param bitmap  需要緩存的圖片
     */
    @Override
    public void putBitmap(String url, Bitmapbitmap) {
       mCache.put(url,bitmap);
    }
}

有了圖片緩存機制,然後我們在配合ImageLoader來進行列表上面加載異步圖片的實現,具體實現方式如下:

/**
 * 當前類註釋:使用ImageLoader來進行測試列表圖片異步加載以及緩存
 * 項目名:FastDev4Android
 * 包名:com.chinaztt.fda.test
 * 作者:江清清 on 15/11/12 15:19
 * 郵箱:[email protected]
 * QQ: 781931404
 * 公司:江蘇中天科技軟件技術有限公司
 */
@EActivity(R.layout.base_adapter_test_layout)
public class VolleyLoaderActivity  extends BaseActivity {
    @ViewById
    ListView lv_base_adapter;
    @ViewById
    TextView tv_title;
    private QuickAdapter<ModuleBean>mAdapter;
    private List<ModuleBean> moduleBeans;
    private RequestQueue requestQueue;
    private ImageLoader imageLoader;
    private ImageLoader.ImageListener listener;
    @Override
    protected void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
        requestQueue=Volley.newRequestQueue(this);
        imageLoader=new ImageLoader(requestQueue,new Fdv_ImageCache());
    }
    @AfterViews
    public void setViews(){
       tv_title.setText("Loader 列表圖片");
    }
    @AfterViews
    public void bindLvData(){
        moduleBeans=DataUtils.getAdapterData();
        if(mAdapter==null) {
            mAdapter = new QuickAdapter<ModuleBean>(this, R.layout.lv_item_base_layout,moduleBeans){
                @Override
                protected void convert(BaseAdapterHelper helper, ModuleBean item) {
                    //列表底下顯示進度
                   mAdapter.showIndeterminateProgress(true);
                   helper.setText(R.id.text_lv_item_title, item.getModulename())
                           .setText(R.id.text_lv_item_description, item.getDescription());
                   //setImageUrl(R.id.img_lv_item, item.getImgurl());
                    //使用ImageLoader進行加載圖片
                    ImageView loader_img=helper.getView(R.id.img_lv_item);
                   listener=ImageLoader.getImageListener(loader_img,R.drawable.ic_loading,R.drawable.ic_loading);
                   imageLoader.get(item.getImgurl(),listener);
                }
            };
           lv_base_adapter.setAdapter(mAdapter);
        }
    }
}

運行效果如下:


().GsonRequest封裝

          前面我們已經使用過JsonObjectRequest,JsonArrayRequest兩個工具類,這邊是採用Android自身提供的JSONObject和JSONArray來進行實現解析JSON數據的,不過我們也知道如果我們已經有JSONObject和JSONArray對象然後一步步的解析還是挺麻煩的,所以我們這邊可以使用JSON快速解析框架Gson來進行解決這個問題。現在我們自定義一個GsonRequest來專門處理請求GSON解析。在做之前我們先要看一下StringRequest的實現,首先StringRequest是繼承Request類然後實現兩個抽象方法,間接着提供若干個構造方法(進行數據初始化,請求類型GET/POST…,請求服務器地址,相應成功是否回調接口)。因爲StringRequest的實現代碼很少而且較簡單,那麼我們模仿StringRequest類的實現可以寫出來一下GsonRequest代碼如下:

/**
 * 當前類註釋:進行擴展GSON數據解析json數據
 * 項目名:FastDev4Android
 * 包名:com.android.volley.toolbox
 * 作者:江清清 on 15/11/12 18:28
 * 郵箱:[email protected]
 * QQ: 781931404
 * 公司:江蘇中天科技軟件技術有限公司
 */
public class GsonRequest<T> extends Request<T> {
    private final Response.Listener<T>listener;
    private Gson gson;
    private Class<T> mClass;
 
    /**
     * GsonRequest 構造函數
     * @param method  請求方法
     * @param url     請求地址
     * @param listener    數據請求成功回調接口
     * @param errorListener  數據請求失敗回調接口
     * @param pClass     需要進行解析的類
     */
    public GsonRequest(int method,Stringurl,Response.Listener<T> listener,Response.ErrorListenererrorListener,Class<T> pClass){
         super(method,url,errorListener);
         this.listener=listener;
         gson=new Gson();
         mClass=pClass;
    }
 
    /**
     * GsonRequest 構造函數  默認使用GET請求方法
     * @param url
     * @param listener
     * @param errorListener
     * @param pClass
     */
    public GsonRequest(Stringurl,Response.Listener<T> listener,Response.ErrorListenererrorListener,Class<T> pClass){
        super(Method.GET,url,errorListener);
        this.listener=listener;
        gson=new Gson();
        mClass=pClass;
    }
 
    /**
     * 數據解析
     * @param response Response from thenetwork  網絡請求返回數據
     * @return
     */
    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonStr=new String(response.data,HttpHeaderParser.parseCharset(response.headers));
            Tdata=gson.fromJson(jsonStr,mClass);
            returnResponse.success(data,HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingExceptione) {
            return Response.error(newParseError(e));
        }
    }
 
    /**
     * 數據分發
     * @param response The parsed responsereturned by
     */
    @Override
    protected void deliverResponse(T response){
          listener.onResponse(response);
    }
}

          以上實現詳解:GsonRequest繼承Request,同樣提供兩個構造函數,然後在parseNetworkResponse()方法中進行解析數據,最後通過Gson組件來封裝數據成Bean對象,最終數據回調即可。具體使用方法如下:

GsonRequest<UpdateBean> gsonRequest=new GsonRequest<UpdateBean>("http://interface.zttmall.com/update/mallUpdate",new Response.Listener<UpdateBean>() {
                    @Override
                    public void onResponse(UpdateBean response) {
                       tv_result.setVisibility(View.VISIBLE);
                       img_result.setVisibility(View.GONE);
                       tv_result.setText(response.toString());
                    }
                }, new Response.ErrorListener(){
                    @Override
                    public void onErrorResponse(VolleyError error) {
 
                    }
                }, UpdateBean.class);

運行效果如下:


().Volley二次封裝(StringRequest爲例)

        我們在使用Volley框架請求網絡數據獲取的時候,一般就是以下三步驟:

           1.創建RequestQueue對象

           2.創建XXRequest對象(XX代表String,JSON,Image等等)

           3.XXRequest對象添加到RequestQueue中即可

        雖然代碼量不是不多,不過也還是需要做創建隊列對象和請求對象加入到隊列中的操作,而創建XxxRequest對象的構造函數中的參數又比較多,所以這邊想了一種方案就是在進行網絡請求的時候創建和add操作放在內部然後構造函數中的參數減少。所以這邊只是以StringRequest爲例,簡單的封裝了一個Get方法請求的方法,其他的功能還有待繼續添加更新。

            我們已StringRequest爲例二次封裝了一個類Fdv_StringRequst,我們來看以下該類的使用方法代碼:

newFdv_StringRequest<String>(VolleyTestActivity.this).get("http://www.baidu.com",new Fdv_CallBackListener<String>() {
                    @Override
                    public void onSuccessResponse(String response) {
                    }
                    @Override
                    public void onErrorResponse(VolleyError error) {
 
                    }
                });

這樣即可,不在需要以前的RequestQueuerequestQueue=Volley.newRequestQueue(this);

requestQueue.add(object)這兩句代碼了,直接在內部已經做了。然後如果Get請求直接調用get()方法即可,不需要顯示傳入請求方法。下面我們來看一下具體實現:


      5.1.定義Fdv_Volley類,裏邊是一個單例方法,來獲取RequestQueue請求隊列對象.

/**
 * 當前類註釋:全局Fdv_Volley封裝類管理類
 * 項目名:FastDev4Android
 * 包名:com.chinaztt.fdv
 * 作者:江清清 on 15/11/11 23:02
 * 郵箱:[email protected]
 * QQ: 781931404
 * 公司:江蘇中天科技軟件技術有限公司
 */
public class Fdv_Volley {
    private static RequestQueue instance;
    public static RequestQueue getInstace(Context pContext){
        if(instance==null){
            instance=Volley.newRequestQueue(pContext);
        }
        return instance;
    }
}

       5.2.定義XxxRequest的基類Fdv_BaseRequest,主要功能獲取請求隊列對象,然後定義一個addRequest()方法,讓子類進行調用,添加當前請求對象到請求隊列中。

/**
 * 當前類註釋:
 * 項目名:FastDev4Android
 * 包名:com.chinaztt.fdv
 * 作者:江清清 on 15/11/11 22:59
 * 郵箱:[email protected]
 * QQ: 781931404
 * 公司:江蘇中天科技軟件技術有限公司
 */
public class Fdv_BaseRequest{
    protected static RequestQueue requestQueue;
    private Context mContext;
    protected Fdv_BaseRequest(ContextpContext){
        this.mContext=pContext;
    }
    /**
     * 請求加入到Volley Request請求隊列中
     * @param request
     */
    protected void addRequest(Request request){
       Fdv_Volley.getInstace(mContext).add(request);
    }

      5.3.請求結果回調接口Fdv_CallBackListener,這邊暫時只加了兩個很簡單的方法,後期會進行擴展

/**
 * 當前類註釋:
 * 項目名:FastDev4Android
 * 包名:com.chinaztt.fdv
 * 作者:江清清 on 15/11/11 23:18
 * 郵箱:[email protected]
 * QQ: 781931404
 * 公司:江蘇中天科技軟件技術有限公司
 */
public interface Fdv_CallBackListener<T> {
    void onSuccessResponse(T response);
    void onErrorResponse(VolleyError error);
}

   5.4.最後是我們的核心類封裝過後的StringRequest,Fdv_StringRequest該類繼承Fdv_BaseRequest類,在該類中我們暫時只是提供一個get()方法來獲取數據中,get()方法的實現還是使用原來的StringRequest進行獲取數據,得到數據使用接口回調即可,實現代碼如下:

/**
 * 當前類註釋:Volley 字符串、文本數據請求封裝類
 * 項目名:FastDev4Android
 * 包名:com.chinaztt.fdv
 * 作者:江清清 on 15/11/11 13:43
 * 郵箱:[email protected]
 * QQ: 781931404
 * 公司:江蘇中天科技軟件技術有限公司
 */
public class Fdv_StringRequest<T> extends Fdv_BaseRequest{
    public Fdv_StringRequest(Context pContext){
        super(pContext);
    }
    public void get(String url, finalFdv_CallBackListener<T> listener){
        StringRequest stringRequest=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(Stringresponse) {
                if(listener!=null){
                   listener.onSuccessResponse((T) response);
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public voidonErrorResponse(VolleyError error) {
                if(listener!=null){
                   listener.onErrorResponse(error);
                }
            }
        });
        addRequest(stringRequest);
    }
}

          OK有了以上的幾步驟,我們的對於StringRequest的get方法請求簡單封裝就完成了,有了這樣的封裝我們的功能實現就會變得代碼稍微少了一點,當然我們現在的封裝的功能還非常的弱,後面我這邊會繼續更新封裝功能以及重構,讓整個工具類變得更加使用。具體更新代碼都會FastDev4Android項目中。後期二次封裝的Volley框架代碼會在Github庫中更新,敬請期待~

        以上所有的功能測試代碼如下:

@EActivity(R.layout.volley_test_layout)
public class VolleyTestActivity  extends BaseActivity{
    private static final StringTAG=VolleyTestActivity.class.toString();
    @ViewById
    LinearLayout top_bar_linear_back;
    @ViewById
    TextView top_bar_title,tv_result;
    @ViewById
    ImageView img_result;
    @ViewById
    Buttonbtn_string,btn_json,btn_image_request,btn_image_loader,btn_image_network,btn_string_post,btn_loader_list,btn_gson;
    @ViewById
    NetworkImageView img_result_network;
    private RequestQueue requestQueue;
    @Override
    protected void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
       requestQueue=Volley.newRequestQueue(this);
    }
   @Click({R.id.top_bar_linear_back,R.id.btn_string,R.id.btn_json,R.id.btn_image_request,R.id.btn_image_loader,R.id.btn_image_network,R.id.btn_string_post,R.id.btn_loader_list,R.id.btn_gson})
    public void backLinearClick(View view){
        switch (view.getId()){
            case R.id.top_bar_linear_back:
                this.finish();
                break;
            case R.id.btn_string:
                //獲取字符串
                Log.d(TAG,"點擊獲取字符串...");
                new Fdv_StringRequest<String>(VolleyTestActivity.this).get("http://www.baidu.com",new Fdv_CallBackListener<String>() {
                    @Override
                    public void onSuccessResponse(String response) {
                       tv_result.setVisibility(View.VISIBLE);
                       img_result.setVisibility(View.GONE);
                       tv_result.setText(response.toString());
                    }
                    @Override
                    public void onErrorResponse(VolleyError error) {
 
                    }
                });
//                StringRequest stringRequest=new StringRequest(Request.Method.GET, "http://www.baidu.com",new Response.Listener<String>() {
//                    @Override
//                    public void onResponse(String response) {
//                       tv_result.setVisibility(View.VISIBLE);
//                       img_result.setVisibility(View.GONE);
//                       tv_result.setText(response.toString());
//                    }
//                }, new Response.ErrorListener(){
//                    @Override
//                    public void onErrorResponse(VolleyError error) {
//
//                    }
//                });
//               requestQueue.add(stringRequest);
                break;
            case R.id.btn_json:
                //獲取json
                Log.d(TAG,"點擊獲取json...");
                JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(Request.Method.GET
                        , "http://interface.zttmall.com/update/mallUpdate",null,new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        Gson gson=new Gson();
                       tv_result.setVisibility(View.VISIBLE);
                       img_result.setVisibility(View.GONE);
                       tv_result.setText(gson.fromJson(response.toString(),UpdateBean.class).toString());
                    }
                }, new Response.ErrorListener(){
                    @Override
                    public void onErrorResponse(VolleyError error) {
 
                    }
                });
               requestQueue.add(jsonObjectRequest);
                break;
            case R.id.btn_image_request:
                //獲取圖片
               //http:\/\/interface.zttmall.com\/Images\/upload\/image\/20150325\/20150325083110_0898.jpg
                Log.d(TAG,"點擊獲取圖片...");
                ImageRequest imageRequest=new ImageRequest("http://interface.zttmall.com/Images/upload/image/20150325/20150325083110_0898.jpg"
                        , newResponse.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap response) {
                       tv_result.setVisibility(View.GONE);
                       img_result.setVisibility(View.VISIBLE);
                       img_result.setImageBitmap(response);
                    }
                }, 0, 0,ImageView.ScaleType.FIT_XY, Bitmap.Config.ARGB_8888, newResponse.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
 
                    }
                });
                requestQueue.add(imageRequest);
                break;
            case R.id.btn_image_loader:
                //使用imageloader進行獲取圖片
                ImageLoader imageLoader=new ImageLoader(requestQueue, new Fdv_ImageCache());
               tv_result.setVisibility(View.GONE);
               img_result.setVisibility(View.VISIBLE);
                ImageLoader.ImageListener listener=ImageLoader.getImageListener(img_result,R.drawable.ic_loading,R.drawable.ic_loading);
               imageLoader.get("http://interface.zttmall.com//Images//upload//image//20150328//20150328105404_2392.jpg",listener);
                break;
            case R.id.btn_image_network:
                //採用NetworkImageView imageview控件
                ImageLoader network_imageLoader=new ImageLoader(requestQueue, new Fdv_ImageCache());
               img_result_network.setVisibility(View.VISIBLE);
               img_result_network.setImageUrl("http://interface.zttmall.com//Images//upload//image//20150325//20150325083214_8280.jpg",network_imageLoader);
                break;
            case R.id.btn_string_post:
                //修改Volley源代碼,擴展StringRequest支持post參數設置
                Map<String,String>params=new HashMap<String,String>();
               params.put("username","zhangsan");
               params.put("password","12345");
                StringRequestpost_stringRequest=new StringRequest("http://10.18.3.123:8080/SalesWebTest/TestVolleyPost",new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                       tv_result.setVisibility(View.VISIBLE);
                       img_result.setVisibility(View.GONE);
                       tv_result.setText(response.toString());
                    }
                }, new Response.ErrorListener(){
                    @Override
                    public void onErrorResponse(VolleyError error) {
 
                    }
                },params);
               requestQueue.add(post_stringRequest);
                break;
            case R.id.btn_loader_list:
                //進行使用ImageLoader加載圖片列表
               openActivity(VolleyLoaderActivity_.class);
                break;
            case R.id.btn_gson:
                //使用擴展工具 GsonRequest進行請求
                GsonRequest<UpdateBean> gsonRequest=new GsonRequest<UpdateBean>("http://interface.zttmall.com/update/mallUpdate",new Response.Listener<UpdateBean>() {
                    @Override
                    public void onResponse(UpdateBean response) {
                       tv_result.setVisibility(View.VISIBLE);
                       img_result.setVisibility(View.GONE);
                       tv_result.setText(response.toString());
                    }
                }, new Response.ErrorListener(){
                    @Override
                    public void onErrorResponse(VolleyError error) {
 
                    }
                }, UpdateBean.class);
                requestQueue.add(gsonRequest);
                break;
        }
    }
    @AfterViews
    public void setViews(){
       top_bar_title.setText("Volley網絡框架測試實例");
    }
}

整個功能測試功能點如下圖:


().結束語:

         到此爲止我們已經講完了Volley框架進階部分:POST請求參數修改,圖片緩存器,使用最佳實踐,二次封裝等相關高級進階。具體實例和框架註釋過的全部代碼已經上傳到FastDev4Android項目中了。同時歡迎大家去Github站點進行clone或者下載瀏覽:

https://github.com/jiangqqlmj/FastDev4Android 同時歡迎大家starfork整個開源快速開發框架項目~

       最後對於Volley框架二次封裝的代碼庫,我這邊會繼續進行更新,後面會放入單獨的Git庫中,庫地址後面會放出來的,敬請期待~

 

尊重原創,轉載請註明:From Sky丶清(http://blog.csdn.net/developer_jiangqq) 侵權必究!

關注我的訂閱號,每天分享移動開發技術(Android/IOS),項目管理以及博客文章!


關注我的微博,可以獲得更多精彩內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章