溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android開源:網(wǎng)絡(luò)框架volley使用(一)---使用方法筆記

發(fā)布時(shí)間:2020-06-23 22:39:35 來源:網(wǎng)絡(luò) 閱讀:3051 作者:glblong 欄目:移動(dòng)開發(fā)

1.Get方法獲取字符串:

    public void loadGetJson(String url)
    {
        //創(chuàng)建RequestQueue對(duì)象,一個(gè)activity創(chuàng)建一個(gè)對(duì)象即可
        RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
        //創(chuàng)建get方法的json請(qǐng)求對(duì)象
        StringRequest sr = new StringRequest(url, new Listener<String>()
        {
            @Override
            public void onResponse(String response)
            {
                Log.e("onResponse", "" + response);
            }
        }, new ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Log.e("onErrorResponse", "" + error.toString());
            }
        });
        //將請(qǐng)求對(duì)象加入到請(qǐng)求隊(duì)列里
        mQueue.add(sr);
    }



2.指定get或者post方法獲取字符串

(1)get方法

RequestQueue requestQueue = Volley.newRequestQueue(this);
                StringRequest sRequest=new StringRequest(Request.Method.GET,CITY_CODE_URL, new Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                                System.out.println(response);                               
                        }
                }, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError arg0) {
                                System.out.println("sorry,Error");
                        }
                });
                sRequest.setShouldCache(false);
                requestQueue.add(sRequest);


(2)post方法

StringRequest中并沒有提供設(shè)置POST參數(shù)的方法,但是當(dāng)發(fā)出POST請(qǐng)求的時(shí)候,Volley會(huì)嘗試調(diào)用StringRequest的父類——Request中的getParams()方法來獲取POST參數(shù),那么解決方法自然也就有了,我們只需要在StringRequest的匿名類中重寫getParams()方法,在這里設(shè)置POST參數(shù)就可以了,代碼如下所示:

StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener) {
	@Override
	protected Map<String, String> getParams() throws AuthFailureError {
		Map<String, String> map = new HashMap<String, String>();
		map.put("params1", "value1");
		map.put("params2", "value2");
		return map;
	}
};


完整范例如下:

    public void loadPostLogin(String url)
    {
        RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
        StringRequest sr = new StringRequest(Request.Method.POST, url, new Listener<String>()
        {
            @Override
            public void onResponse(String response)
            {
                Log.e("onResponse", "" + response);
            }
        }, new ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Log.e("onErrorResponse", "" + error.toString());
            }
        })
        {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError
            {
                Map<String, String> map = new HashMap<String, String>();  
                map.put("UserName", "glblong");  
                map.put("PassWord", "123456"); 
                return map;
            }
        };
        mQueue.add(sr);
    }


3.JsonObjectRequest和JsonArrayRequest用法與StringRequest一致,方法如下:

第二個(gè)參數(shù)說明:

Constructor which defaults to GET if jsonRequest is null, POST otherwise.

默認(rèn)情況下設(shè)成null為get方法,否則為post方法。


        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>()
        {
            @Override
            public void onResponse(JSONObject response)
            {
                Log.d("TAG", response.toString());
            }
        }, new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Log.e("TAG", error.getMessage(), error);
            }
        });


4.ImageRequest用法

    /**
     * 第三第四個(gè)參數(shù)分別用于指定允許圖片最大的寬度和高度,如果指定的網(wǎng)絡(luò)圖片的寬度或高度大于這里的最大值,則會(huì)對(duì)圖片進(jìn)行壓縮,
     * 指定成0的話就表示不管圖片有多大,都不會(huì)進(jìn)行壓縮。
     * 
     * @param url
     *            圖片地址
     * @param listener
     * @param maxWidth
     *            指定允許圖片最大的寬度
     * @param maxHeight
     *            指定允許圖片最大的高度
     * @param decodeConfig
     *            指定圖片的顏色屬性,Bitmap.Config下的幾個(gè)常量.
     * @param errorListener
     */
    public void getImgRequest(final ImageView iv, String url)
    {
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        ImageRequest ir = new ImageRequest(url, new Listener<Bitmap>()
        {
            public void onResponse(Bitmap response)
            {
                iv.setImageBitmap(response);
            };
        }, 0, 0, Config.RGB_565, new ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                // TODO Auto-generated method stub
                
            }
        });
        queue.add(ir);
    }


5. ImageLoader用法

ImageLoader比ImageRequest更加高效,因?yàn)樗粌H對(duì)圖片進(jìn)行緩存,還可以過濾掉重復(fù)的鏈接,避免重復(fù)發(fā)送請(qǐng)求。

        //1.創(chuàng)建RequestQueue實(shí)例
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        //2.創(chuàng)建ImageLoader實(shí)例,ImageCache需要重寫才能實(shí)現(xiàn)緩存
        ImageLoader il = new ImageLoader(queue, new ImageCache()
        {
            @Override
            public void putBitmap(String url, Bitmap bitmap)
            {
                // TODO Auto-generated method stub
            }
            @Override
            public Bitmap getBitmap(String url)
            {
                // TODO Auto-generated method stub
                return null;
            }
        });
        //3.創(chuàng)建ImageListener實(shí)例,設(shè)置默認(rèn)圖片和加載失敗圖片
        ImageListener listener = ImageLoader.getImageListener(iv, R.drawable.img_loading, R.drawable.img_failed);
        //4.通過get方法加載圖片
        il.get(url, listener);


使用范例代碼如下:

(1)先實(shí)現(xiàn)ImageCache接口

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

import com.android.volley.toolbox.ImageLoader.ImageCache;

public class ImageLoaderCache implements ImageCache
{
    private LruCache<String, Bitmap> mCache;
    
    public ImageLoaderCache()
    {
        int maxSize = 10 * 1024 * 1024;//設(shè)置緩存圖片的大小為10M
        mCache = new LruCache<String, Bitmap>(maxSize)
        {
            @Override
            protected int sizeOf(String key, Bitmap bitmap)
            {
                return bitmap.getRowBytes() * bitmap.getHeight();
            }
        };
    }
    
    @Override
    public Bitmap getBitmap(String url)
    {
        return mCache.get(url);
    }
    
    @Override
    public void putBitmap(String url, Bitmap bitmap)
    {
        mCache.put(url, bitmap);
    }
}


(2)使用方法如下:

    public void getImgLoader(ImageView iv,String url)
    {
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        ImageLoader il = new ImageLoader(queue, new ImageLoaderCache());
        ImageListener listener = ImageLoader.getImageListener(iv, R.drawable.img_loading, R.drawable.img_failed);
        //加載并限定圖片寬度和高度
        il.get(url, listener, 200, 300);
    }


6.NetworkImageView的用法

NetworkImageView在加載圖片的時(shí)候會(huì)自動(dòng)獲取自身控件的寬高,然后對(duì)比網(wǎng)絡(luò)圖片的寬度,再?zèng)Q定是否需要對(duì)圖片進(jìn)行壓縮。也就是說,壓縮過程是在內(nèi)部完全自動(dòng)化的,并不需要我們關(guān)心,NetworkImageView會(huì)始終呈現(xiàn)給我們一張大小剛剛好的網(wǎng)絡(luò)圖片,不會(huì)多占用任何一點(diǎn)內(nèi)存。


如果不想對(duì)圖片進(jìn)行壓縮的話,只需要在布局文件中把NetworkImageView的layout_width和layout_height都設(shè)置成wrap_content就可以了,這樣NetworkImageView就會(huì)將該圖片的原始大小展示出來,不會(huì)進(jìn)行任何壓縮。


(1)布局文件中添加NetworkImageView控件

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/networkImageView1"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="60dp"
        android:src="@drawable/ic_launcher" />

2.代碼實(shí)現(xiàn)

        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        ImageLoader p_w_picpathLoader = new ImageLoader(queue, new ImageLoaderCache());
        
        NetworkImageView niv = (NetworkImageView) findViewById(R.id.networkImageView1);
        
        niv.setDefaultImageResId(R.drawable.img_loading);
        niv.setErrorImageResId(R.drawable.img_failed);
        niv.setImageUrl(url, p_w_picpathLoader);


7.取消請(qǐng)求

Volley提供了強(qiáng)大的API取消未處理或正在處理的請(qǐng)求。取消請(qǐng)求最簡單的方法是調(diào)用請(qǐng)求隊(duì)列cancelAll(tag)的方法,前提是你在添加請(qǐng)求時(shí)設(shè)置了標(biāo)記。這樣就能使標(biāo)簽標(biāo)記的請(qǐng)求掛起。


給請(qǐng)求設(shè)置標(biāo)簽:

request.setTag("My Tag");


使用ApplicationController添加使用了標(biāo)簽的請(qǐng)求到隊(duì)列中:

ApplicationController.getInstance().addToRequestQueue(request, "My Tag");


取消所有指定標(biāo)記的請(qǐng)求:

mRequestQueue.cancelAll("My Tag");





參考:

  1. Android開源:網(wǎng)絡(luò)框架volley使用(一)---使用方法筆記

  2. Android開源:網(wǎng)絡(luò)框架volley使用(二)---框架的自定義改造

  3. Asynchronous HTTP Requests in Android Using Volley 



向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI