1.Get方法获取字符串:
public void loadGetJson(String url) { //创建RequestQueue对象,一个activity创建一个对象即可 RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext()); //创建get方法的json请求对象 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()); } }); //将请求对象加入到请求队列里 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中并没有提供设置POST参数的方法,但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了,代码如下所示:
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一致,方法如下:
第二个参数说明:
Constructor which defaults to GET if jsonRequest is null, POST otherwise.
默认情况下设成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用法
/** * 第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩, * 指定成0的话就表示不管图片有多大,都不会进行压缩。 * * @param url * 图片地址 * @param listener * @param maxWidth * 指定允许图片最大的宽度 * @param maxHeight * 指定允许图片最大的高度 * @param decodeConfig * 指定图片的颜色属性,Bitmap.Config下的几个常量. * @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更加高效,因为它不仅对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。
//1.创建RequestQueue实例 RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); //2.创建ImageLoader实例,ImageCache需要重写才能实现缓存 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.创建ImageListener实例,设置默认图片和加载失败图片 ImageListener listener = ImageLoader.getImageListener(iv, R.drawable.img_loading, R.drawable.img_failed); //4.通过get方法加载图片 il.get(url, listener);
使用范例代码如下:
(1)先实现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;//设置缓存图片的大小为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在加载图片的时候会自动获取自身控件的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终呈现给我们一张大小刚刚好的网络图片,不会多占用任何一点内存。
如果不想对图片进行压缩的话,只需要在布局文件中把NetworkImageView的layout_width和layout_height都设置成wrap_content就可以了,这样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩。
(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.代码实现
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.取消请求
Volley提供了强大的API取消未处理或正在处理的请求。取消请求最简单的方法是调用请求队列cancelAll(tag)的方法,前提是你在添加请求时设置了标记。这样就能使标签标记的请求挂起。
给请求设置标签:
request.setTag("My Tag");
使用ApplicationController添加使用了标签的请求到队列中:
ApplicationController.getInstance().addToRequestQueue(request, "My Tag");
取消所有指定标记的请求:
mRequestQueue.cancelAll("My Tag");
参考:
Android开源:网络框架volley使用(一)---使用方法笔记
Android开源:网络框架volley使用(二)---框架的自定义改造
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。