发送一个简单的 Request

发送一个简单的 Request

在一个较高层次上,你可以使用 Volley 创建一个 RequestQueue 然后可以传递一个 Request 对象。RequestQueue 管理 worker threads(工作线程) 来操作网络,读取和写入 cache ,解析 response。
Requests 解析原始的 Responses 然后 Volley 会负责分发解析过的 response 到主线程

这节课描述了如何使用 Volley.newRequestQueue 便利方法来发送一个 Request,如果想自己配置一个 RequestQueue,点击下节课,Setting up a RequestQueue 查看更多关于如何配置一个自己的 RequestQueue

这节课也描述了如何添加一个 Request 至 RequestQueue 和如何取消一个 Request。

添加 INTERNET 权限

为了使用 Volley,你必须添加 android.permission.INTERNET 权限到你的 App manifest 文件里。没有该权限,你的 App 无法连接到网络

使用 newRequestQueue

Volley 提供了一个配置 RequestQueue 的便利方法 Volley.newRequestQueue,内部使用默认的值和启动队列的自动操作。例如:

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

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

// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
        new Response.Listener<String>() {
@Override
public void onResponse(String response) {
    // Display the first 500 characters of the response string.
    mTextView.setText("Response is: "+ response.substring(0,500));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
    mTextView.setText("That didn't work!");
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);

Volley 总是在 main thread 回调当中发送 parsed Response, 运行在主线程中可以方便将接受到的数据与需要填充数据的 UI 进行对照,这样你就可以在响应处理类中直接自由的修改你的 UI 和数据的对照,但是要尤其注意该 library 中的重要语义,尤其是和取消 request 相关的。

查看 Settings up a RequestQueue 里的描述如何配置一个自己的 RequestQueue 而不是使用 Volley.newRequestQuenue 便利方法。

发送一个 Request

为了发送一个 request,你可以简单地构造一个然后调用 RequestQueue.add() 方法添加一个 request,就像上面所说的,一旦添加一个 request ,该 request 就会通过管道被移动,获得处理服务,然后解析原始的 response 最后发送该 response。

当你调用 add()方法时,Volley 运行一个 cache 处理 thread 和维护一个网络调度 thread pool,当你添加一个 request 到队列时,该 request 会被 cache thread 接手并被筛选:如果该 request 可以被 cache 处理,那么这个 cached response 会在 cache thread 被解析然后这个 parsed response 会被发送到 main thread。如果这个 request 不能被 cache 处理,该 request 就会被放置到 network queue,第一个可用的 network thread 会从 queue 取出这个 request, 执行 HTTP 事务,在 work thread 中解析 response,将该 response 写入 cache 中,然后传递 parsed responsed 到 main thread 中

注意那些像 I/O 流,解码/解析 这些耗时的操作是在 work thread 中被执行的,你可以在任意的 thread 中添加一个 request,但是 responses 总是会在 main thread 中被传递。

图 1 说明了一个 request 的生命周期:

volley-request

图 1.request 的生命周期

取消一个 request

可以调用需要被取消的 Request 对象的 cancel() 方法来取消该 request,一旦被取消,Volley 会保证你的 response 处理类相关回调不会被调用。在实际中意味着你可以在你的 Activity的 onStop 中取消你的 pending requests 并且你不需要在你的响应类中检查 getActivity()==null,不管 onSaveInstanceState() 是否已经被回调,或者其他类似这样的检查代码来回收你的 response 处理类。

为了利用这个优势,你通常必须跟踪所有 in-flight request 在适当的时间来取消它们。有一个更加简单的方法:你可以在每一个 request 上关联一个 tag 对象。你可以使用它们来取消一个范围内的 requests。例如,你可以使用 Activity 来标记所有与之相关的 request,然后从该 Activity 的 onStop 方法中调用 requestQueue.cancelAll(this)。类似的,你可以标记在 ViewPager 各自的 tab 中标记所有的缩略图 request,然后在滑动时取消这些 request 来确保新 tab 中的 request 不会被另一个 tab 中的 request 所阻塞。

这里有一个使用一个 string 值作为 tag 的例子:

  1. 定义你的 tag 并添加到你的 request 中.

     public static final String TAG = "MyTag";
     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);
    
  2. 在你的 Activity 的 onStop 方法中取消所有标记为该 tag 的 request.

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

注意当你取消 request 时,如果你需要依赖你的 response 处理类来推出一个状态或者启动另一个进程,你需要注意这个。再一次说明,取消response 会导致你的 response 处理类相关回调不会被调用

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

推荐阅读更多精彩内容