发送一个简单的请求

在一个high level来看,你使用Volley的方式大体为,创建一个RequestQueue,并给它传递Request对象。RequestQueue管理worker线程来执行网络操作,读取和写入缓存,解析响应。Requests执行对于原始响应的解析,Volley则主要是把解析后的响应分发回到主线程,以delivery。

这一节描述如何发送一个请求,使用方便的Volley.newRequestQueue方法,它会为你建立一个RequestQueue。参考下一节,建立一个RequestQueue,来获取更多关于如何建立一个你自己的RequestQueue的信息。

这一节也会描述如何给一个RequestQueue添加一个请求,及取消一个请求。

添加INTERNET Permission

要使用Volley,你必须把android.permission.INTERNET permission添加到你的app的manifest中。没有这个权限,则你的app将不能连接网络。

使用newRequestQueue

Volley提供了一个方便的方法Volley.newRequestQueue来为你使用默认的值建立一个RequestQueue,并启动queue。比如:

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 thread中delivers解析后的响应。在main thread中执行,由于你可以自由地直接在你的response handler中修改UI组件,因而便于把接收到的数据填充在UI组件中,对于library提供的许多重要的语义也特别重要,尤其是与取消请求相关的那些。

参考建立一个RequestQueue的描述,来了解你自己如何建立一个RequestQueue,而不是使用Volley.newRequestQueue convenience方法。

发送一个Request

要发送一个请求,你可以简单地构造一个并通过add()把它添加到RequestQueue中。一旦你添加了请求,它会moves through管道,get serviced,并使它的响应得到解析及deliver。

当你调用add()时,Volley执行一个缓存处理线程,及一个网络调度线程池。当你给queue添加一个request时,它会被cache线程拿起并triaged:如果请求能够被cache线程服务,则缓存的响应在cache线程中解析,解析后的响应在main thread中delivered。如果请求无法在cache线程中服务,则它被放进network queue。第一个可用的network线程从queue中拿到请求,执行HTTP事务,在worker线程中解析响应,把响应写入cache,并把解析之后的响应posts回main thread来delivery。

注意要在worker threads中完成昂贵的操作,比如阻塞I/O和解析/解码。你可以在任何线程中添加一个请求,但响应总是在main thread中delivered。

Figure 1描绘了一个请求的生命:

发送一个简单的请求_第1张图片

Figure 1. Life of a request.

取消一个请求

要取消一个请求,则可以在你的Request object上调用cancel()。一旦被取消了,Volley保证你的response handler将从不会被调用。在实践上这意味着你可以在你的activity的onStop()方法中取消你所有的pending requests,并且你不需要用forgetActivity() == null之类的检查onSaveInstanceState()是否已经被调用了,或其他的防御性code,把你的response handler弄的乱七八糟。

要利用这种行为,典型地你将不得不追踪所有的in-flight请求以便于能够在适当的时间取消它们。有一种更简单的方式:你可以给每个请求关联一个标签对象。然后你可以使用这个标签来提供一个要取消的请求的范围。比如,你可以用Activity来标记与其中创建的你所有的请求,并在onStop()中调用requestQueue.cancelAll(this)。类似的,在一个ViewPager tab中的所有的缩略图请求,你可以用它们各自的tabs来标记,并在swipe时取消以确保新的tab不会被另一个tab中的请求所held up。

这里是一个使用了一个字符串值作为标记的例子:

  1. 定义你的标记并把它加进requests。
    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()方法中,取消具有这一标记的所有的请求。
    @Override
    protected void onStop () {
        super.onStop();
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(TAG);
        }
    }

取消请求时要小心。如果你依赖于你的response handler来前进到一个状态或启动另一个进程,则你需要考虑到这一点。再次,response handler将不会被取消。

译自:http://developer.android.com/training/volley/simple.html

Done.

你可能感兴趣的:(发送一个简单的请求)