【译】Volley官方文档三:建立一个RequestQueue

原文链接:Setting Up a RequestQueue

这节课教你:

  • 建立一个Network和Cache
  • 使用单例模式

先前的教程教你如何使用Volley.newRequestQueue这个便捷的方法类建立一个RequestQueue,使用Volley的默认行为(译注:默认值)。这节课带你通过明确的步骤来创建一个RequestQueue,你可以使用自定义的行为(译注:自定义值)。

这节课还要阐述创建一个RequestQueue的推荐实践,就是单例,它使得RequestQueue与app的生命周期相伴。

建立一个Network和Cache

RequestQueue 需要两个东西才能工作:一个是network来完成request的传输,另一个是cache来处理缓存。在Volley的工具箱中对这些有标准的实现:DiskBasedCache提供了每个响应一个文件的缓存,使用内存中索引,BasicNetwork提供了一个基于你优选的HTTP客户端的网络传输。

BasicNetwork是Volley的默认网络实现。BasicNetwork必须被你的app连接网络所使用的HTTP客户端初始化。典型情况是HttpURLConnection

下面的代码片段展示了建立一个RequestQueue需要的步骤:

// 使用 cache 和 network初始化 RequestQueue
mRequestQueue = new RequestQueue(cache, network);

// 启动队列
mRequestQueue.start();

String url ="http://www.example.com";

// 明确描述请求(request)并处理响应(response)
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
        new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        // 处理响应信息
    }
},
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // Handle error
    }
});

// 添加request 到 RequestQueue.
mRequestQueue.add(stringRequest);

// ...

如果你只是产生一次性的request而不想留下线程池,你可以使用Sending a Simple Request中描述的Volley.newRequestQueue()在任何你需要的地方创建RequestQueue ,然后一旦响应或错误返回了,在RequestQueue调用stop()。但是更普遍的用法是使用单例创建RequestQueue,让RequestQueue伴随着app的生命周期一直运行,这个在下一个部分讨论。

使用单例模式

如果你的应用需要经常使用网络,那么创建单例的RequestQueue会更高效。你可以通过多种方式实现。推荐的方式是实现一个单例类来封装RequestQueue和其它的Volley有的功能。另一种方式是继承Application并在Application.onCreate()方法中构建RequestQueue。但是我们不鼓励这样做。一个静态的单例能够更加模块化地提供相同的功能。

关键的是RequestQueue必须用Application的context来初始化,而不是Activity的context。这样才能保证RequestQueue能够伴随着应用的生命周期存在,而不是随着activity的每次重建而重建(比如,当用户旋转设备)。

下面是一个单例类的例子,提供了RequestQueueImageLoader的功能:

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) {
            // getApplicationContext() 是关键, 它避免了你
            //传递进Activity或BroadcastReceiver导致的内存泄漏
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

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

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}

下面是使用单例类来执行RequestQueue操作的例子:

// 获取一个RequestQueue
RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
    getRequestQueue();

// ...

// 添加一个request (示例中为 stringRequest) 到RequestQueue中
MySingleton.getInstance(this).addToRequestQueue(stringRequest);

项目源码下载点击下载


系列索引


更新日志 ↓ ↓ ↓

  • 2016年03月21日:添加了系列索引
  • 2016年03月20日
    - 翻译了代码中的英文
    - 添加了源码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容