Android热门网络框架Volley详解

.Volley简介

volley的英文意思为‘群发’、‘迸发’。Volley是2013年谷歌官方发布的一款Android平台上的网络通信库。Volley非常适合一些数据量不大,但需要频繁通信的网络操作。使用Volley进行网络开发可以使我们的开发效率得到很大的提升,而且性能的稳定性也比较高。但是Volley不适用于文件的上传下载操作。

Volley的特点:

>1 使网络通信更快,更简单,更健壮;

>2 Get/Post网络请求及网络图像的高效率异步请求;  

>3 可以对网络请求的优先级进行排序处理;

>4 可以进行网络请求的缓存;

>5 可以取消多级别请求;

>6 可以和Activity生命周期联动。

为什么要使用Volley?

功能上:

高效的Get/Post方式的数据请求交互;

网络图片的加载和缓存过程简单化。

其他:

谷歌官方退出的,比较权威;

性能很稳定、强劲。

.使用Volley

1.Volley的网络请求队列建立与取消队列请求

使用Volley需要建立一个全局的请求队列,这样我们就可以将一个请求加入到这个全局队列中,并可以管理整个APP的所有请求,包括取消一个或所有的请求。

2.Volley的Get和Post请求方式的使用

Volley的Get和Post请求方式其实是对Android原生Get和Post请求方式进行了二次封装,对效率等进行优化。在使用Get和Post请求方式之前,我们要确定所请求的数据返回什么对象,Volley自带了三种返回类型:

StringRequest:主要使用在对请求数据的返回类型不确定的情况下,StringRequest涵盖了JsonObjectRequest和JsonArrayRequest。

JsonObjectRequest:当确定请求数据的返回类型为JsonObject时使用。

JsonArrayRequest:当确定请求数据的返回类型为JsonArray时使用。

3.Volley与Activity生命周期的联动

简单来说就是Volley中的请求是与Activity的生命周期进行关联。这样可以在Android销毁时关闭Volley的请求,防止请求在后台运行造成内存溢出等情况发生。与Activity生命周期进行联动时需要设置Tag标签,因为取消请求需要在请求队列中通过Tag标签进行查找,在Activity的onStop中执行取消请求的操作。

下面通过代码进行实例的演示。

使用Volley前需要往项目中导入Volley的jar包。没有的可以直接点此下载:volley.jar

首先我们需要自定义一个Application用于创建一个全局的请求队列。

MyApplication.java

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

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.cbt.learnvolley"
          xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 添加网络操作权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>

    <!-- 注册自定义的Application:android:name=".MyApplication" -->
    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

.使用Get方式请求数据返回StringRequest对象

当想返回String类型的请求结果数据或者不清楚返回什么类型时可以用StringRequest对象。

下面使用Get请求方式返回一个String类型的手机归属地信息。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        volleyGet();
    }

    /**
     *  new StringRequest(int method,String url,Listener listener,ErrorListener errorListener)
     *  method:请求方式,Get请求为Method.GET,Post请求为Method.POST
     *  url:请求地址
     *  listener:请求成功后的回调
     *  errorListener:请求失败的回调
     */
    private void volleyGet() {
        String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443";
        StringRequest request = new StringRequest(Method.GET, url,
                new Listener<String>() {
                    @Override
                    public void onResponse(String s) {//s为请求返回的字符串数据
                        Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
                    }
                },
                new ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
                    }
                });
        //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
        request.setTag("testGet");
        //将请求加入全局队列中
        MyApplication.getHttpQueues().add(request);
    }

}

运行结果:

.使用Get方式请求数据返回JsonObjectRequest对象

由于我们知道这个请求返回的是Json格式的数据,所以我们可以直接使用JsonObjectRequest作为请求返回结果对象。

下面使用Get请求方式返回一个Json格式的IP地址信息,这里只是展示一下返回的数据信息,具体的Json解析方法大家可自行研究。

/**
 *  new JsonObjectRequest(int method,String url,JsonObject jsonObject,Listener listener,ErrorListener errorListener)
 *  method:请求方式,Get请求为Method.GET,Post请求为Method.POST
 *  url:请求地址
 *  JsonObject:Json格式的请求参数。如果使用的是Get请求方式,请求参数已经包含在url中,所以可以将此参数置为null
 *  listener:请求成功后的回调
 *  errorListener:请求失败的回调
 */
private void volleyGet() {
    String url = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255";
    JsonObjectRequest request = new JsonObjectRequest(Method.GET, url, null,
            new Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject jsonObject) {//jsonObject为请求返回的Json格式数据
                    Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show();
                }
            },
            new ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
                }
            });

    //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
    request.setTag("testGet");
    //将请求加入全局队列中
    MyApplication.getHttpQueues().add(request);
}

运行结果:

返回JsonArrayRequest对象的方法与JsonObjectRequest比较类似,这里就不再演示,请大家自行实现。

.使用Post方式请求数据返回StringRequest对象

使用Post方式需要手动传递请求参数,可以重写Request类的getParams()方法将请求参数名和参数值放入Map中进行传递。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        volleyPost();
    }

    /**
     * 使用Post方式返回String类型的请求结果数据
     *
     *  new StringRequest(int method,String url,Listener listener,ErrorListener errorListener)
     *  method:请求方式,Get请求为Method.GET,Post请求为Method.POST
     *  url:请求地址
     *  listener:请求成功后的回调
     *  errorListener:请求失败的回调
     */
    private void volleyPost() {
        String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm";
        StringRequest request = new StringRequest(Method.POST, url,
                new Listener<String>() {
                    @Override
                    public void onResponse(String s) {//s为请求返回的字符串数据
                        Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
                    }
                },
                new ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
                    }
                }){
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String,String> map = new HashMap<>();
                        //将请求参数名与参数值放入map中
                        map.put("tel","15850781443");
                        return map;
                    }
                }
                ;
        //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
        request.setTag("testPost");
        //将请求加入全局队列中
        MyApplication.getHttpQueues().add(request);
    }
}

.使用Post方式请求数据返回JsonObject对象

/**
 *  使用Post方式返回JsonObject类型的请求结果数据
 *
 *  new JsonObjectRequest(int method,String url,JsonObject jsonObject,Listener listener,ErrorListener errorListener)
 *  method:请求方式,Get请求为Method.GET,Post请求为Method.POST
 *  url:请求地址
 *  JsonObject:Json格式的请求参数。如果使用的是Get请求方式,请求参数已经包含在url中,所以可以将此参数置为null
 *  listener:请求成功后的回调
 *  errorListener:请求失败的回调
 */
private void volleyPost() {
    String url = "http://www.kuaidi100.com/query";
    Map<String,String> map = new HashMap<>();
    map.put("type","yuantong");
    map.put("postid","229728279823");
    //将map转化为JSONObject对象
    JSONObject jsonObject = new JSONObject(map);

    JsonObjectRequest request = new JsonObjectRequest(Method.POST, url, jsonObject,
            new Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject jsonObject) {//jsonObject为请求返回的Json格式数据
                    Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show();
                }
            },
            new ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
                }
            });
    //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
    request.setTag("testPost");
    //将请求加入全局队列中
    MyApplication.getHttpQueues().add(request);
}

.与Activity生命周期联动

可以在Activity关闭时取消请求队列中的请求。

@Override
protected void onStop() {
    super.onStop();
    //通过Tag标签取消请求队列中对应的全部请求
    MyApplication.getHttpQueues().cancelAll("abcGet");
}

.使用ImageRequest加载网络图片

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private ImageView image;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        image = (ImageView) findViewById(R.id.image);
        loadImageByVolley();
    }

    /**
     *  通过Volley加载网络图片
     *
     *  new ImageRequest(String url,Listener listener,int maxWidth,int maxHeight,Config decodeConfig,ErrorListener errorListener)
     *  url:请求地址
     *  listener:请求成功后的回调
     *  maxWidth、maxHeight:设置图片的最大宽高,如果均设为0则表示按原尺寸显示
     *  decodeConfig:图片像素的储存方式。Config.RGB_565表示每个像素占2个字节,Config.ARGB_8888表示每个像素占4个字节等。
     *  errorListener:请求失败的回调
     */
    private void loadImageByVolley() {
        String url = "http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
        ImageRequest request = new ImageRequest(
                            url,
                            new Listener<Bitmap>() {
                                @Override
                                public void onResponse(Bitmap bitmap) {
                                    image.setImageBitmap(bitmap);
                                }
                            },
                            0, 0, Config.RGB_565,
                            new ErrorListener() {
                                @Override
                                public void onErrorResponse(VolleyError volleyError) {
                                    image.setImageResource(R.mipmap.ic_launcher);
                                }
                            });

        //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
        request.setTag("loadImage");
        //通过Tag标签取消请求队列中对应的全部请求
        MyApplication.getHttpQueues().add(request);
    }

}

运行结果:

.使用ImageLoader加载及缓存网络图片

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private ImageView image;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        image = (ImageView) findViewById(R.id.image);
        loadImageWithCache();
    }
/**
     *  通过ImageLoader加载及缓存网络图片   *
     *  new ImageLoader(RequestQueue queue,ImageCache imageCache)
     *  queue:请求队列
     *  imageCache:一个用于图片缓存的接口,一般需要传入它的实现类
     *
     *  getImageListener(ImageView view, int defaultImageResId, int errorImageResId)
     *  view:ImageView对象
     *  defaultImageResId:默认的图片的资源Id
     *  errorImageResId:网络图片加载失败时显示的图片的资源Id
     */
    private void loadImageWithCache() {
        String url = "http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
        ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCache());
        ImageListener listener = loader.getImageListener(image,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
        //加载及缓存网络图片
        loader.get(url,listener);
    }
}

BitmapCache.java

public class BitmapCache implements ImageLoader.ImageCache{
    //LruCache是基于内存的缓存类
    private LruCache<String,Bitmap> lruCache;
    //LruCache的最大缓存大小
    private int max = 10 * 1024 * 1024;

    public BitmapCache() {
        lruCache = 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 lruCache.get(s);
    }

    @Override
    public void putBitmap(String s, Bitmap bitmap) {
        lruCache.put(s,bitmap);
    }
}

运行结果:

完整源码:点击下载

作者:caobotao

出处: http://www.cnblogs.com/caobotao/p/5071658.html

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

时间: 2024-10-07 03:52:18

Android热门网络框架Volley详解的相关文章

Android判断网络状态方法详解

Android 判断网络状态这一应用技巧在实际应中是比较重要的.那么,在Android操作系统中,如何能够正确的判断我们所连接的网络是否断开恩?今天我们就针对这一应用技巧进行一个详细的分析. 1.public class ConnectionChangeReceiverextends BroadcastReceiver 2.{ [email protected] 4.public void onReceive( Context context,Intent intent ) 5.{ 6.Conn

Android网络通信必备神器Volley详解——实现一个自定义的Request(以Gson为例)

虽然Volley已经提供了对于String,图片,JSON,Request的解析,但是总会有些数据不属于以上三种的,这时候就需要我们来自己实现的一个Request来解析我们需要的数据. 实现一个自定义的Request很简单: 1. 继承Request<T>,T代表你要解析的类型,比如服务器返回的response是一个String,那么就要继承Request<String> 2. 实现parseNetworkResponse()和deliverResponse()方法. parseN

Android BLE基础框架使用详解

http://blog.csdn.net/xiaoyaoyou1212/article/details/52346904 ANDROID的 BLUETOOTH 实现机制与架构 http://blog.csdn.net/pashanhu6402/article/details/53404685

Android笔记(六十二)网络框架volley

什么是Volley 很多时候,我们的APP都需要用到网络技术,使用HTTP协议来发送接收数据,谷歌推出了一个网络框架——volley,该框架适合进行数据量不大,但通信频繁的网络操作. 它的优点: (1)默认Android2.3及以上基于HttpURLConnection,2.3以下使用基于HttpClient: (2)符合Http 缓存语义 的缓存机制(提供了默认的磁盘和内存等缓存): (3)请求队列的优先级排序: (4)提供多样的取消机制: (5)提供简便的图片加载工具(其实图片的加载才是我们

Android中的几种网络请求方式详解

http://blog.csdn.net/zuolongsnail/article/details/6373051 Android应用中使用AsyncHttpClient来异步网络数据 http://blog.csdn.net/sdvch/article/details/13615605 Android中的几种网络请求方式详解,布布扣,bubuko.com

Android网络框架-Volley实践 使用Volley打造自己定义ListView

这篇文章翻译自Ravi Tamada博客中的Android Custom ListView with Image and Text using Volley 终于效果 这个ListView呈现了一些影视信息,每一行是一个影片的信息,每一行中有一张电影的图片,电影的名字.评分.类型.年份等信息. 1.json数据 我们通过解析json然后拿到数据,这个json数据包含json数组.每一个json数组中是一个json对象,json对象中包含了电影的图片url地址.标题.年份.评分.类型等信息 JSO

ym—— Android网络框架Volley(实战篇)

转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103).谢谢支持. 之前讲了ym-- Android网络框架Volley(体验篇),大家应该了解了volley的使用,接下来我们要看看怎样把volley使用到实战项目里面,我们先考虑下一些问题: 从上一篇来看 mQueue 仅仅须要一个对象就可以,new RequestQueue对象对资源一种浪费,我们应该在application.以及能够把取消请求的方法也在application进行统一管理,看下面代

ym—— Android网络框架Volley(体验篇)

<a target=_blank href="https://android.googlesource.com/platform/frameworks/volley" style="font-family: Arial, Helvetica, sans-serif; box-sizing: border-box; background-image: initial; background-attachment: initial; background-color: rg

Android网络框架Volley

Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp 他们各有优劣,之前个人则比较喜欢用Android-async-http, 如今Google推出了官方的针对Android平台上的网络通信库,能使网络通信更快,更简单,更健壮,Volley在提供了高性能网络通讯功能的同时,对网络图片加载也提供了良好的支持,完全可以满足简单REST客户端的需求, 我们