Android网络请求 ------ Volley的使用
来源:互联网 发布:湖北软件开发公司 编辑:程序博客网 时间:2024/05/01 22:34
Volley是Google官方的网络异步请求库,最大的特点是简单高效,多并发。但Volley不适合数据的上传和下载。
一、Get请求的使用
1、根据请求数据返回的形式选择合适的对象
Volley提供了StringRequest、JsonObjectRequest、JsonArrayRequest三种对象供我们选择。
(a)StringRequest ——- 主要用于我们不确定数据返回类型的情况。
(b)JsonObjectRequest ——- 主要用于返回的数据类型是JsonObject的情况。
(c)JsonArrayRequest ——- 主要用于返回的数据类型是JsonArray的情况。
注:StringRequest是包含其他两种类型的,选择使用最合适最接近的类型可以提升性能。
2、生成请求对象
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { //成功的接口回调 @Override public void onResponse(String s) { Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show(); }}, new Response.ErrorListener() { //失败的接口回调 @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(MainActivity.this,volleyError.toString(), Toast.LENGTH_LONG).show(); }});
3、创建请求队列,以便存放上面创建的请求
public class MyApplication extends Application { private static RequestQueue queues; @Override public void onCreate() { super.onCreate(); //实例化请求队列 queues = Volley.newRequestQueue(getApplicationContext()); } public static RequestQueue getHttpQueues(){ return queues; }}
注:还要在AndroidManifest.xml文件中的application标签中加入刚才新建的MyApplication。
android:name=".MyApplication"
4、给请求设置tag标签
stringRequest.setTag("phone");
5、将请求加入请求队列
MyApplication.getHttpQueues().add(stringRequest);
二、Post请求的使用
Post请求的使用,绝大部分步骤是与Get请求是相同的,唯一的区别在于Get请求将要请求的参数以 ? + 键值对的方式接在链接之后,而Post请求需要重写其中的方法来传入参数,如下:
StringRequest str = new StringRequest(Request.Method.POST, url , new Response.Listener<String>() { @Override public void onResponse(String s) { }}, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { }}){ @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> map = new HashMap<>(); map.put("apikey", apiKey); map.put("method", "publish"); map.put("appkey", "5316bd7179b6570f2ca6e20b"); map.put("seckey", "sec-qaAQOCmuFL22b0mv78hcOEyc9DzB9q0zesIfBAereaN6FAcb"); map.put("topic", "test_topic"); map.put("msg", "this is one message"); return map; }};
上面我们都是只介绍了StringRequest类,假设我们返回的是JsonObject类型的数据,我们采用JsonObjectRequest类呢,其实大部分参数还是不变的,只是她的构造函数多了一个JsonObject类型的参数,用于传入需要POST的数据,如果是Get方式,则直接传入null,下面是一个简单的例子:
private void volleyPost() {final String apiKey = "f04a61e";String url = "http://apis.baidu.com/yunba/realtime_restful_api/publish";Map<String, String> map = new HashMap<>();map.put("apikey", apiKey);map.put("method", "publish");map.put("appkey", "5316bd7179b6570f2ca6e20b");map.put("seckey", "sec-qaAQOCmuFL22b0mv78hcOEyc9DzB9q0zesIfBAereaN6FAcb");map.put("topic", "test_topic");map.put("msg", "this is one message");JSONObject json = new JSONObject(map);JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, url, json, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { Toast.makeText(MainActivity.this, "DD" + jsonObject.toString(), Toast.LENGTH_LONG).show(); }}, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(MainActivity.this, "F" + volleyError.toString(), Toast.LENGTH_LONG).show(); }}); jsonRequest.setTag("xiao"); MyApplication.getHttpQueues().add(jsonRequest);}
注:我们还应该在Activity的生命周期结束时,结束网络请求,所以我们需要在Activity的onStop()方法中添加如下一句:
MyApplication.getHttpQueues().cancelAll("tag");
三、使用Volley加载网络图片
Volley中加载网络图片有很多种方式:
1、使用ImageRequest加载网络图片
ImageRequest加载网路图片的方式和Volley中进行一般的网络请求差别不大,只是参数略有不同。参数依次为图片url、请求成功的回调、图片的最大宽度,最大高度(此处传入0则是用原始尺寸解码显示,传入其他数据则按比例进行缩放解码)、图片的缩放类型、图片的显示配置、请求失败的回调。下面是一个简单的例子:
/** * 网络请求并设置图片 */private void setImage() { String url = ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap bitmap) { imageView.setImageBitmap(bitmap); } }, 0, 0, ImageView.ScaleType.CENTER_INSIDE, Bitmap.Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { imageView.setBackgroundResource(R.mipmap.ic_launcher); } }); request.setTag("image"); MyApplication.getHttpQueues().add(request);}
注:图片的网路请求还是和前面一样需要设置tag,再加入请求队列中。
2、使用 LruCache、ImageCache和ImageLoader结合加载网络图片
我可以先定义一个类用于实现ImageCache,在其中结合LruCache完成对图片的缓存,这个类的实例将作为后面的参数传入。
public class BitmapCache implements ImageLoader.ImageCache { public LruCache<String, Bitmap> cache; //最大缓存为10M,当缓存大于设定值时将自动启动垃圾回收 public int max = 10 * 1024 * 1024; public BitmapCache(){ //实例化cache cache = new LruCache<String, Bitmap>(max){ @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight(); } }; } @Override public Bitmap getBitmap(String s) { //返回缓存中的图片 return cache.get(s); } @Override public void putBitmap(String s, Bitmap bitmap) { cache.put(s, bitmap); }}
接下来我们需要获得ImageLoader的实例
//创建ImageLoader的实例(参数依次为请求队列和图片缓存)ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCache());
接着我们需要获得图片加载监听类的实例
imageView = (ImageView) findViewById(R.id.show_image);//创建图片加载监听实例(参数依次为图片显示控件实例,默认显示的图片的id,加载出错时显示的图片的id)ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher);
最后我们传入相应的参数来加载图片
String url = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1472736685&di=ea36b0007865cef24d9d659c03b26485&src=http://img.sucai.redocn.com/attachments/images/201002/20100206/20100206_c3f11163684180e389c57LUEUjSMDaax.jpg";loader.get(url, listener);
3、使用Volley自带的NetworkImageView结合ImageLoader进行图片加载
首先获得ImageLoader的实例
//创建ImageLoader的实例(参数依次为请求队列和图片缓存)ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCache());
获得NetworkImageView的实例并设置简单的参数
//设置默认显示的图片 netImageview.setDefaultImageResId(R.mipmap.ic_launcher);//设置加载错误时需要显示的图片 netImageview.setErrorImageResId(R.mipmap.ic_launcher);
最后设置需要加载的图片
//设置需要加载的图片netImageview.setImageUrl(url, loader);
以上就是我在学习Volley的过程中的一个简单的记录总结。
- Android网络请求框架Volley的使用
- android网络请求Volley框架的使用
- Android 网络请求Volley的使用
- Android网络请求 ------ Volley的使用
- Android使用Volley请求网络
- Android网络请求框架volley 的原理的与使用
- android Volley请求网络框架的使用(一)
- android中网络请求库volley的使用
- com.android.volley 里面网络请求的使用
- Android网络请求操作Volley框架的使用
- Android Volley的使用(一)基本网络请求
- Android网络请求框架:Volley简单使用
- Android使用Volley请求网络图片
- android 网络请求 volley
- Android网络请求Volley
- Android Volley使用之二:Volley请求网络图片
- Android Volley的网络请求工具
- Volley网络请求的简单封装使用
- Linux命令(5):pwd
- 编写一个程序,查找C语言中的基本语法错误,如圆括号、方括号、花括号不配对等,正确处理引号与注释
- reaLine()和read()
- C++ PRIMER 5th 学习小结(第三章)
- 二叉树的实现
- Android网络请求 ------ Volley的使用
- 分布函数和概率密度函数的区别
- cocos2d-JS 屏幕适配(5种适配模式)
- StringUtils中isEmpty 和isBlank的区别
- 383. Ransom Note [easy] (Python)
- 进程同步
- Bolts-Android
- 初识基于 Web 的可视化编程工具Google Blockly
- 一篇关于apache commons类库的详解