Volley Lesson 1 -Sending a Simple Request(译)

Volley的学习初步打算如下几个步骤:

  1. 学习Android Training中的关于Volley使用的几篇文章
  2. 分析Volley的源代码
本篇是Training中的第一篇文章,《Sending a Simple Request》,主要分为以下几个部分:
  1. 添加INTERNET权限
  2. 使用newRequestQueue
  3. 发送请求Request
  4. 取消请求Request
在高层来看,我们使用volley,只要创建一个RequestQueue,然后传递给这个RequestQueue一个Request即可。RequestQueue会管理工作线程(Worker threads)来运行网络操作,对缓存的读取或者写入操作,对请求做出相应。Request来解析raw的相应,并且Volley会仔细处理并发送给main线程。

添加Intent权限

“android.permission.INTERNET”添加到Android manifest中即可。

使用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() {
    @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线程中来分发解析过的相应。这样的话可以更好的根据接收到的数据来操作相关的UI控件,同时,对于库中的很多操作来说,这是严格要求的,比如取消requests。

可以通过查看下一篇文章《Setting Up a RequestQueue》来自己创建一个RequestQueue。

发送请求

要发送请求,只要构建一个请求,并且在RequestQueue中使用add方法加入进去即可。一旦加入到Queue之中,那么它的请求就会放进流水线中,得到处理,得到的元数据raw response会得到解析,并且分发出来。

当我们调用add()方法的时候,Volley一直有一个cache处理线程,和一个网络分发线程的pool线程池在运行。当我们将一个request加入到queue中,这个请求就会并cache线程处理并分类:如果这个请求在cache中命中,那么缓存的响应就会在cache线程中得到解析并且在main线程中派发。如果这个请求无法在cache中命中,那么会发到network队列中。从中找到第一个可以获得的网络线程,拿到这个请求,执行相关的HTTP传输操作,然后在work线程中解析相应的结果,然后写入缓存cache,再然后将解析后的响应传递给main线程来派发。

注意到,其中费时的操作,比如阻塞的I/O操作,或者解析/解码操作都是在worker线程中进行的。我们可以在任何一个线程中想RequestQueue中添加请求,但结果都会在main线程中得到派发。

下图1展示了一个请求的生命周期。

取消请求

为了取消请求,调用cancel方法即可。一旦被取消,Volley可以保证我们的请求处理(response handler)不会再被调用。这意味着,我们只要再activity的onStop()方法中调用cancel()方法,那么我们就不需要在response的handlers中检车getActivity()==null,不管onSaveInstanceState()是否被调用,或者是其他的被保持的引用。

为了更好的利用这个优势,我们需要跟踪所有的正在执行的请求,以便于在某个特定的时刻取消它们。有一个简单的途径来实现这个目的,我们可以为每一个request绑定一个tag object,然后就可以利用这个tag来搜索所有需要取消的请求。比如说,我们可以为请求绑定请求发起的Activity,然后在onStop中调用requestQueue.cancelAll(this)即可。同样的,对于ViewPager来说,我们可以将请求绑定在特定的tabs上,这样就可以取消相应tab上的请求。

以下是一个例子:

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、在onStop方法中,取消所有的tag绑定的请

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

在取消请求的时候一定要仔细处理。如果我们需要依赖response的handler来处理的话,我们必须特别仔细考虑,因为只要我们取消了请求,那么这个handler永远不会被调用的。

About: happyhls


发表评论

电子邮件地址不会被公开。 必填项已用*标注