什么是Volley
很多时候,我们的APP都需要用到网络技术,使用HTTP协议来发送接收数据,谷歌推出了一个网络框架——volley,该框架适合进行数据量不大,但通信频繁的网络操作。
它的优点:
(1)默认Android2.3及以上基于HttpURLConnection,2.3以下使用基于HttpClient;
(2)符合Http 缓存语义 的缓存机制(提供了默认的磁盘和内存等缓存);
(3)请求队列的优先级排序;
(4)提供多样的取消机制;
(5)提供简便的图片加载工具(其实图片的加载才是我们最为看重的功能)
它的缺点:
不适合数据量大的传输,例如下载、视频传输等
首先获取Volley的jar包,具体方法不赘述。
https://android.googlesource.com/platform/frameworks/volley
如何使用Volley
最简单的使用方法可以归纳为:
1.创建一个请求队列→2.创建一个请求→3.将请求加到队列中
就是这么简单!
StringRequest
一个简单的例子:
MainActivity.java
package com.example.volleydemo; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.Response.Listener; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private Button bt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt = (Button) findViewById(R.id.bt); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 定义一个请求队列 RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); // 定义一个字符串请求 // StringRequest的构造方法需要传入三个参数,第一个参数是我们要请求的地址,第二个参数当我们的请求响应成功时候的回调,第三个参数是当我们请求失败时候的回调 StringRequest sr = new StringRequest("http://www.baidu.com", new Listener<String>() { @Override public void onResponse(String response) { Log.d("TTTT", response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("TTTT", "连接出错啦!!"); } }); // 将请求加入到队列中 requestQueue.add(sr); } }); } }
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.volleydemo.MainActivity" > <Button android:id="@+id/bt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="click me" /> </RelativeLayout>
因为我们需要访问网络,我们还需要添加INTERNET权限,我们先不加试试,不加权限,运行的结果是:
可以看到执行了onErrorResponse中内容
我们加上权限
<uses-permission android:name="android.permission.INTERNET"/>
运行结果:
执行成功!Volley就是这么简单
JsonRequest
MainActivity.java
package com.example.volleydemo; import org.json.JSONObject; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.Volley; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private Button bt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt = (Button) findViewById(R.id.bt); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 定义一个请求队列 RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); // 定义一个jsonobject请求 // JsonObjectRequest的构造方法需要传入三个参数,第一个参数是我们要请求的地址,第二个参数是我们要传递给服务器的参数,如果没有,则为null,第三个参数当我们的请求响应成功时候的回调,第四个参数是当我们请求失败时候的回调 JsonObjectRequest jsonObjectRequest = new JsonObjectRequest( "https://api.heweather.com/x3/weather?cityid=CN101010100&key=5d520eb089e646acb270521a7e387", null, new Response.Listener<JSONObject>() { public void onResponse(JSONObject response) { Log.d("TTTT", response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub } }); // 将请求加入到队列中 requestQueue.add(jsonObjectRequest); } }); } }
执行结果:成功!
ImageRequest
ImageRequest的使用方法和之前的一样,也是创建队列,创建请求,把请求加入到队列中,只不过ImageRequest的构造方法参数比较多,他们的含义分别为:
url:请求地址
listener:相应成功回调方法
maxWidth:允许图片的最大宽度,如果指定的网络图片宽度大于这里的值,则会进行压缩,如果为0则不进行压缩
maxHeight:允许图片的最大高度,如果指定的网络图片高度大于这里的值,则会进行压缩,如果为0则不进行压缩
decodeConfig:执行图片的颜色属性Bitmap.Config下的几个常量都可以在这里使用
errorListener:请求失败回调方法
MainActivity.java
package com.example.volleydemo; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageRequest; import com.android.volley.toolbox.Volley; import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.View; import android.widget.Button; @SuppressLint("NewApi") public class MainActivity extends Activity { private Button bt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt = (Button) findViewById(R.id.bt); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 定义一个请求队列 RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); // 定义一个ImageRequest请求 ImageRequest imageRequest = new ImageRequest( "http://images.cnblogs.com/cnblogs_com/xs104/722323/o_pic.jpg", new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { // 将请求返回的Bitmap对象转换为Drawable对象 Drawable drawable = new BitmapDrawable(response); // 将图片设置为背景 findViewById(R.id.layout).setBackground(drawable); } }, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); // 将请求加入到队列中 requestQueue.add(imageRequest); } }); } }
运行结果: