Android之Volley框架在实际开发过程中运用

  这个章节我们来讲下Volley在实际开发中如何正确地运用它。废话不说,进入正题。

集成 Volley

  如果使用Android Studio开发的读者可以直接添加远程依赖:

  

    compile ‘com.mcxiaoke.volley:library:1.0.19‘

  如果使用Ecplise开发的读者可以在lib中加入jar,可以自己通过源码进行打包成jar,我这里就直接给出Volley.jar资源了。点此下载Volley.jar


Volley的Requst

final TextView mTextView = (TextView) findViewById(R.id.text);
...

// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="https://www.baidu.com/";

StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        mTextView.setText("Response is: "+ response.substring(0,500));
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        mTextView.setText("That didn‘t work!");
    }
});
queue.add(stringRequest);

这是Volley的常规用法:

  1. 创建一个RequestQueue对象
  2. 创建一个继承自Request抽象类的子类请求对象
  3. 将请求对象加入到RequestQueue中

      我们在StringRequest中传了四个参数,分别是:请求方法、url的字符串、请求成功的回调以及请求失败的回调。我们可以在回调中实现我们想要的具体逻辑。无论是StringRequest还是JsonRequest以及其他继承了Request类的对象,都是如此使用。

      在开发过程中,比如在一个Activity有多个需要加载网络图片的ImageView,我们将多个Request加入到RequestQueue中,此时图片还没全部显示出来,我们点了后退键。此时,这个Acitivity销毁了,此时我们请求还在队列中,视图却已经销毁了,这样子就很容易造成效率的影响。所以我们可以在Activity中写如下代码:

      

public static final String TAG = MainActivity.class.getSimpleName();
StringRequest stringRequest; // Assume this exists.
RequestQueue mRequestQueue;  // Assume this exists.

// Set the tag on the request.
stringRequest.setTag(TAG);

// Add the request to the RequestQueue.
mRequestQueue.add(stringRequest);

这里我们为每个Request设置了标签,并且标签最好以类名定义,这样子方便管理。然后我们在Activity的Stop方法中可以这么写:

@Override
protected void onStop () {
    super.onStop();
    if (mRequestQueue != null) {
        mRequestQueue.cancelAll(TAG);
    }
}

可以看到,我们取消掉了在RequestQueue中所有有此标签的Request。


Volley的RequestQueue:

在开发中,我们最好设计一个全局的RequestQueue对象,此时,你可能很容易想到在继承于Application中的Oncreate方法初始化它,但是这样子是不推荐的,会引起很多不必要的麻烦。现在我们通过单例模式来创建它:
public class MySingleton {
    private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private static Context mCtx;

    private MySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
            private final LruCache<String, Bitmap>
                    cache = new LruCache<String, Bitmap>(20);

            @Override
            public Bitmap getBitmap(String url) {
                return cache.get(url);
            }

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

    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}

这里我们Volley.newRequestQueue(mCtx.getApplicationContext());传入了了ApplicationContext对象,这是一个全局对象,如果我们传入了Activity或者Service的Context,就会引起内存泄漏。在这里初始化了RequestQueue对象以及一个ImageLoader。关于ImageLoader我们接下去再说,现在我们可以这样使用RequestQueue:

RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
    getRequestQueue();
MySingleton.getInstance(this).addToRequestQueue(stringRequest);

这样子就全局管理了RequestQueue。


Volley的NetworkImageView

  Volley封装了一个继承自ImageView的NetworkImageView,还记得我们在RequestQueue单例中还初始化了一个ImageLoader吗,它能简单快捷地与NetworkImageView联合使用。我们可以在ListView的Item布局中使用NetworkImageView,然后用ImageLoader加载图片。

在Xml布局中定义很简单:

<com.android.volley.toolbox.NetworkImageView
        android:id="@+id/networkImageView"
        android:layout_width="150dp"
        android:layout_height="170dp"
        android:layout_centerHorizontal="true" />

然后在视图中代码可以这么写:

ImageLoader mImageLoader;
NetworkImageView mNetworkImageView;
private static final String IMAGE_URL =
 "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
mNetworkImageView = (NetworkImageView) 

findViewById(R.id.networkImageView);

mImageLoader = MySingleton.getInstance(this).getImageLoader();

mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);

  可以看到我们在这里mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader); 方法中只传入了一个url以及一个加载器就可以。

  我们比较一下ImageView配合ImageLoader的代码:

  

ImageLoader mImageLoader;
ImageView mImageView;
private static final String IMAGE_URL =
 "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
mImageView = (ImageView) findViewById(R.id.regularImageView);
mImageLoader = MySingleton.getInstance(this).getImageLoader();
mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,
         R.drawable.def_image, R.drawable.err_image));

很明显看到,代码不如用NetworkImageView与Imageloader配合来的简洁。

时间: 2024-10-09 00:10:37

Android之Volley框架在实际开发过程中运用的相关文章

Android网络通信Volley框架源码浅析(三)

尊重原创 http://write.blog.csdn.net/postedit/26002961 通过前面浅析(一)和浅析(二)的分析,相信大家对于Volley有了初步的认识,但是如果想更深入的理解,还需要靠大家多多看源码. 这篇文章中我们主要来研究一下使用Volley框架请求大量图片的原理,在Android的应用中,通过http请求获取的数据主要有三类: 1.json 2.xml 3.Image 其中json和xml的获取其实原理很简单,使用Volley获取感觉有点大财小用了,了解Volle

Android之Volley框架源码分析

临近毕业,各种事情各种忙.我也没有认真专注写过博客,最近仔细看了Volley框架的使用及其源码,思前想后,想挑战一下自己,还是写一篇博客来分享,如有错误,欢迎吐槽. Volley简介 网络请求是一个App很重要的一部分,android系统只是提供了一个平台,而android应用则是基于这个平台上进行展示数据,起到与用户进行交互的作用,数据来源于服务端,而二者之间必须通过互联网进行传输数据,在Android系统发布初期,很多开发者都是在Apache协会的Http协议的基础上进行网络请求方法的封装,

Android利用Volley框架加载网络图片

Volley框架是在Google I/O 2013上Volley发布的,目的是使Android平台上的网络通信库,能使网络通信更快,更简单,更健壮.我们也简单了解下Volley引入的背景,在Volley出现以前,我们可能面临如下的问题,比如要在ListView或是GridView中加载数量较多的图片时:先在ListAdapter#getView()里开始图像的读取,再通过AsyncTask等机制使用HttpURLConnection从服务器去的图片资源,然后在AsyncTask#onPostEx

Android网络通信Volley框架源代码浅析(二)

尊重原创 http://write.blog.csdn.net/postedit/25921795 在前面的一片文章Volley框架浅析(一)中我们知道在RequestQueue这个类中,有两个队列:本地队列和网络队列 /** The cache triage queue. */ private final PriorityBlockingQueue<Request<?>> mCacheQueue = new PriorityBlockingQueue<Request<

Android——使用Volley+fastJson在新线程中读取网络接口获取天气信息

一,关于Volley 其实最初对于网络数据的访问,我是没想到要用框架的,使用HttpURLConnection或者HttpGet or HttpPost都可以实现.但是why? why I have to use Volley?   Before Volley: class HttpURLConnection_post extends Thread{ @Override public void run() { //设置请求的路径 String strUrl="http://api.qingyun

android 网络 Volley框架

下载Volley 介绍了这么多理论的东西,下面我们就准备开始进行实战了,首先需要将Volley的jar包准备好,如果你的电脑上装有Git,可以使用如下命令下载Volley的源码: [plain] view plaincopy git clone https://android.googlesource.com/platform/frameworks/volley 下载完成后将它导入到你的Eclipse工程里,然后再导出一个jar包就可以了.如果你的电脑上没有Git,那么也可以直接使用我导出好的j

Android的volley框架心得

小弟很懒,不喜欢写这些总结,主要是表达能力有限,如果想一起交流volley相关的,可以看看我的github Volley 大家一起学习进步 1. Volley中添加url参数和表单 请求中添加Url参数,需要自己拼接字符串,或者重写getUrl方法 StringBuilder sb = new StringBuilder(); if (!url.contains("?")) { url = url + "?"; } else { if (!url.endsWith(

Android Volley 框架的使用(一)

为什么要使用Volley框架 开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等: 而Volley框架就是为解决这些而生的,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷:抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Req

安卓中自定义并使用Volley框架请求网络

大家好,今天我们讲一下如何使用Volley框架请求网络,为何要使用Volley框架,这就要先说一下使用Volley框架请求网络的优点了,volley是易于定制的,即你可以根据需求来设定volley框架,还有volley框架支持请求的优先级设定,即你可以自主设定网络请求的优先级,还有就是volley框架请求支持取消单个或多个请求,这个一会设置请求的时候会特别说明,还有它可以自动调度网络请求,至于其他的如代码的健壮性.支持多并发等等就不一一列举了,说了那么多下面就介绍如何自定义并使用Volley框架