Volley框架的详细使用

转载: https://blog.csdn.net/u011324501/article/details/53933212

Volley可以 自动调度网络请求 多个并发的网络连接 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致 支持请求优先级 支持取消请求的强大API,可以取消单个请求或多个 易于定制 健壮性:便于正确的更新UI和获取数据 包含调试和追踪工具等优点。

Volley特别适合数据量不大但是通信频繁的场景。

1、首先下载一个volley.jar包导入libs文件下,下载地址http://download.csdn.net/detail/u010049692/7813127

2、新布局代码中添加几个按钮,两个图片按钮和一个textview用于显示数据


 
 
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id= "@+id/activity_main"
  4. android:layout_width= "match_parent"
  5. android:layout_height= "match_parent"
  6. android:orientation= "vertical">
  7. <Button
  8. android:id= "@+id/volley_get"
  9. android:layout_width= "match_parent"
  10. android:layout_height= "wrap_content"
  11. android:layout_marginTop= "5dip"
  12. android:text= "get请求" />
  13. <Button
  14. android:id= "@+id/volley_post"
  15. android:layout_width= "match_parent"
  16. android:layout_height= "wrap_content"
  17. android:layout_marginTop= "5dip"
  18. android:text= "post请求" />
  19. <Button
  20. android:id= "@+id/volley_json"
  21. android:layout_width= "match_parent"
  22. android:layout_height= "wrap_content"
  23. android:layout_marginTop= "5dip"
  24. android:text= "请求json数据请求" />
  25. <Button
  26. android:id= "@+id/volley_imageRequest"
  27. android:layout_width= "match_parent"
  28. android:layout_height= "wrap_content"
  29. android:layout_marginTop= "5dip"
  30. android:text= "imageRequest加载图片" />
  31. <Button
  32. android:id= "@+id/volley_imageLader"
  33. android:layout_width= "match_parent"
  34. android:layout_height= "wrap_content"
  35. android:layout_marginTop= "5dip"
  36. android:text= "imageLader加载图片" />
  37. <Button
  38. android:id= "@+id/netWorkImageView"
  39. android:layout_width= "match_parent"
  40. android:layout_height= "wrap_content"
  41. android:layout_marginTop= "5dip"
  42. android:text= "netWorkImageView" />
  43. <TextView
  44. android:layout_width= "match_parent"
  45. android:layout_height= "wrap_content"
  46. android:layout_marginTop= "5dip"
  47. android:text= "显示结果" />
  48. <ImageView
  49. android:id= "@+id/volley_image"
  50. android:layout_width= "wrap_content"
  51. android:layout_height= "wrap_content"
  52. android:layout_marginTop= "5dip" />
  53. <com.facebook.drawee.view.SimpleDraweeView
  54. android:id= "@+id/volley_imageNet"
  55. android:layout_width= "wrap_content"
  56. android:layout_height= "wrap_content"
  57. android:layout_marginTop= "5dip" />
  58. <ScrollView
  59. android:layout_width= "match_parent"
  60. android:layout_height= "match_parent"
  61. android:layout_marginTop= "5dip">
  62. <TextView
  63. android:id= "@+id/volley_result"
  64. android:layout_width= "match_parent"
  65. android:layout_height= "wrap_content"
  66. android:text= "" />
  67. </ScrollView>
  68. </LinearLayout>
3、由于要显示网络图片,所以添加fresco,需要在build.gradle 中添加下面代码,并在需要在新建一个MyApplication类,记得在权限中添加。还要添加网络权限代码
compile 'com.facebook.fresco:fresco:0.12.0'
 
 

 
 
  1. package com.example.apple.volley;
  2. import android.app.Application;
  3. import com.facebook.drawee.backends.pipeline.Fresco;
  4. /**
  5. * Created by apple on 16/12/29.
  6. */
  7. public class MyApplication extends Application {
  8. public MyApplication() {
  9. super();
  10. }
  11. @Override
  12. public void onCreate() {
  13. super.onCreate();
  14. //Fresco初始化
  15. Fresco.initialize(getApplicationContext());
  16. }
  17. }


 
 
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package= "com.example.apple.volley">
  4. <uses-permission android:name="android.permission.INTERNET" />
  5. <application
  6. android:name= ".MyApplication"
  7. android:allowBackup= "true"
  8. android:icon= "@mipmap/ic_launcher"
  9. android:label= "@string/app_name"
  10. android:supportsRtl= "true"
  11. android:theme= "@style/AppTheme">
  12. <activity android:name=".MainActivity">
  13. <intent-filter>
  14. <action android:name="android.intent.action.MAIN" />
  15. <category android:name="android.intent.category.LAUNCHER" />
  16. </intent-filter>
  17. </activity>
  18. </application>
  19. </manifest>
4、先实现get 请求,首先创建一个队列,然后创建一个请求,将url传进去,请求中有两个方法,当正确接受数据时可以打印出来,错误时也可以显示出来,最后添加到队列中,这就完成了get请求。返回的数据可自己处理。


 
 
  1. /**
  2. * get
  3. */
  4. public void get(){
  5. //创建一个请求队列
  6. requestQueue = Volley.newRequestQueue(MainActivity.this);
  7. //创建一个请求
  8. String url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
  9. StringRequest stringRequest =new StringRequest(url, new Response.Listener <String>() {
  10. //正确接收数据回调
  11. @Override
  12. public void onResponse(String s) {
  13. try {
  14. JSONObject jsonObject = new JSONObject(s);
  15. // TestData testData= new Gson().fromJson(s, TestData.class);
  16. // Log.e(TAG,"length="+jsonObject.getJSONObject("trailers").length());
  17. // for (int i = 0;i <jsonObject.getJSONObject("trailers").length();i++){
  18. volley_result.setText(s);
  19. Log.e(TAG,"s="+jsonObject.getJSONArray("trailers").get(0)+"\n");
  20. // }
  21. } catch (JSONException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }, new Response.ErrorListener() {//异常后的监听数据
  26. @Override
  27. public void onErrorResponse(VolleyError volleyError) {
  28. volley_result.setText("加载错误"+volleyError);
  29. }
  30. });
  31. //将get请求添加到队列中
  32. requestQueue.add(stringRequest);
  33. }

5、实现post请求,post请求跟get差不多,都要创建一个队列,然后创建一个请求,再添加到队列中,不同的是,需要在创建请求时声明是POST,传入参数时可以用Map,然后返回。

 
 
  1. private void post(){
  2. //创建一个请求队列
  3. requestQueue = Volley.newRequestQueue(MainActivity.this);
  4. //创建一个请求
  5. String url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
  6. StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener <String>() {
  7. @Override
  8. public void onResponse(String s) {
  9. volley_result.setText(s);
  10. }
  11. }, new Response.ErrorListener() {
  12. @Override
  13. public void onErrorResponse(VolleyError volleyError) {
  14. volley_result.setText("加载错误"+volleyError);
  15. }
  16. }){
  17. @Override
  18. protected Map <String, String> getParams() throws AuthFailureError {
  19. Map <String,String> map = new HashMap <>();
  20. // map.put("value1","param1");//传入参数
  21. return map;
  22. }
  23. };
  24. //将post请求添加到队列中
  25. requestQueue.add(stringRequest);
  26. }

6、json请求,跟上面基本一样,但是如果数据格式外面时{}需要用JsonObjectRequest,如果时[]则要用JsonArrayRequest,返回的是JSONObject数据。


 
 
  1. private void json(){
  2. //创建一个请求队列
  3. requestQueue = Volley.newRequestQueue(MainActivity.this);
  4. //创建一个请求
  5. String url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
  6. JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener <JSONObject>() {
  7. @Override
  8. public void onResponse(JSONObject jsonObject) {
  9. //TestData data = new Gson().fromJson(String.valueOf(jsonObject),TestData.class);
  10. volley_result.setText(jsonObject.toString());
  11. Log.e(TAG,"data="+jsonObject);
  12. }
  13. }, new Response.ErrorListener() {
  14. @Override
  15. public void onErrorResponse(VolleyError volleyError) {
  16. volley_result.setText("加载错误"+volleyError);
  17. }
  18. });
  19. //将创建的请求添加到队列中
  20. requestQueue.add(jsonObjectRequest);
  21. }

7、加载图片,也是需要那三步,但是是用ImageRequest。


 
 
  1. /**
  2. * 加载图片
  3. */
  4. private void image(){
  5. //创建一个请求队列
  6. requestQueue = Volley.newRequestQueue(MainActivity.this);
  7. //创建一个请求
  8. String url = "http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg";
  9. //第二个参数,第三个:宽高,第四个:图片质量
  10. ImageRequest imageRequest = new ImageRequest(url, new Response.Listener <Bitmap>() {
  11. @Override
  12. public void onResponse(Bitmap bitmap) {
  13. //正确接收图片
  14. volley_image.setImageBitmap(bitmap);
  15. }
  16. }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
  17. @Override
  18. public void onErrorResponse(VolleyError volleyError) {
  19. volley_image.setImageResource(R.mipmap.ic_launcher);
  20. }
  21. });
  22. //将创建的请求添加到队列中
  23. requestQueue.add(imageRequest);
  24. }
8、加载网络图片,这个可以新建一个BitmapCache类用来缓存图片


 
 
  1. private void imageLoader(){
  2. //创建一个请求队列
  3. requestQueue = Volley.newRequestQueue(MainActivity.this);
  4. //创建一个请求
  5. // ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
  6. // @Override
  7. // public Bitmap getBitmap(String s) {
  8. // return null;
  9. // }
  10. //
  11. // @Override
  12. // public void putBitmap(String s, Bitmap bitmap) {
  13. //
  14. // }
  15. // });
  16. ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());//带缓存
  17. //加载图片
  18. String url = "http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg";
  19. //加载不到,加载失败
  20. ImageLoader.ImageListener imageLister = imageLoader.getImageListener(volley_imageNet,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
  21. imageLoader.get(url,imageLister);
  22. }

 
 
  1. package com.example.apple.volley.entity;
  2. import android.graphics.Bitmap;
  3. import android.util.LruCache;
  4. import com.android.volley.toolbox.ImageLoader;
  5. /**
  6. * Created by apple on 16/12/29.
  7. * 图片缓存
  8. */
  9. public class BitmapCache implements ImageLoader.ImageCache{
  10. private LruCache <String,Bitmap> mCache;
  11. public BitmapCache() {
  12. int maxSize = 10* 1024 *1024;//10m
  13. mCache = new LruCache <String,Bitmap>(maxSize){
  14. @Override
  15. protected int sizeOf(String key, Bitmap bitmap) {
  16. return bitmap.getRowBytes() * bitmap.getHeight();
  17. }
  18. };
  19. }
  20. @Override
  21. public Bitmap getBitmap(String url) {
  22. return mCache.get(url);
  23. }
  24. @Override
  25. public void putBitmap(String url, Bitmap bitmap) {
  26. mCache.put(url,bitmap);
  27. }
  28. }
10、加载网络图片

 
 
  1. /**
  2. * netWorkImageView
  3. */
  4. private void netWorkImageView(){
  5. //创建一个请求队列
  6. requestQueue = Volley.newRequestQueue(MainActivity.this);
  7. //创建一个imageLoader
  8. ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());
  9. //默认图片设置
  10. volley_imageNet.setImageResource(R.mipmap.ic_launcher);
  11. //加载图片
  12. String url = "http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg";
  13. volley_imageNet.setImageURI(url,imageLoader);
  14. }
11、最后可以在stop中添加取消所有队列


 
 
  1. @Override
  2. protected void onStop() {
  3. super.onStop();
  4. //取消队列里所有的请求
  5. requestQueue.cancelAll(this);
  6. }

完整代码:


 
 
  1. package com.example.apple.volley;
  2. import android.graphics.Bitmap;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.ImageView;
  9. import android.widget.TextView;
  10. import com.android.volley.AuthFailureError;
  11. import com.android.volley.Request;
  12. import com.android.volley.RequestQueue;
  13. import com.android.volley.Response;
  14. import com.android.volley.VolleyError;
  15. import com.android.volley.toolbox.ImageLoader;
  16. import com.android.volley.toolbox.ImageRequest;
  17. import com.android.volley.toolbox.JsonObjectRequest;
  18. import com.android.volley.toolbox.StringRequest;
  19. import com.android.volley.toolbox.Volley;
  20. import com.example.apple.volley.entity.BitmapCache;
  21. import com.facebook.drawee.view.SimpleDraweeView;
  22. import org.json.JSONException;
  23. import org.json.JSONObject;
  24. import java.util.HashMap;
  25. import java.util.Map;
  26. /**
  27. * JSON,图像等的异步下载;
  28. 网络请求的排序(scheduling)
  29. 网络请求的优先级处理
  30. 缓存
  31. 多级别取消请求
  32. 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)
  33. */
  34. public class MainActivity extends AppCompatActivity implements View.OnClickListener{
  35. private Button volley_get;
  36. private Button volley_post;
  37. private Button volley_json;
  38. private Button volley_imageRequest;
  39. private Button volley_imageLader;
  40. private Button netWorkImageView;
  41. private ImageView volley_image;
  42. private SimpleDraweeView volley_imageNet;
  43. private TextView volley_result;
  44. private final String TAG = "MainActivity";
  45. RequestQueue requestQueue;
  46. @Override
  47. protected void onCreate(Bundle savedInstanceState) {
  48. super.onCreate(savedInstanceState);
  49. setContentView(R.layout.activity_main);
  50. initView();
  51. }
  52. private void initView() {
  53. volley_get = (Button)findViewById(R.id.volley_get);
  54. volley_get.setOnClickListener(this);
  55. volley_post = (Button)findViewById(R.id.volley_post);
  56. volley_post.setOnClickListener(this);
  57. volley_json = (Button)findViewById(R.id.volley_json);
  58. volley_json.setOnClickListener(this);
  59. volley_imageRequest = (Button)findViewById(R.id.volley_imageRequest);
  60. volley_imageRequest.setOnClickListener(this);
  61. volley_imageLader = (Button)findViewById(R.id.volley_imageLader);
  62. volley_imageLader.setOnClickListener(this);
  63. netWorkImageView = (Button)findViewById(R.id.netWorkImageView);
  64. netWorkImageView.setOnClickListener(this);
  65. volley_image = (ImageView) findViewById(R.id.volley_image);
  66. volley_imageNet = (SimpleDraweeView) findViewById(R.id.volley_imageNet);
  67. volley_result = (TextView)findViewById(R.id.volley_result);
  68. }
  69. @Override
  70. public void onClick(View v) {
  71. switch (v.getId()){
  72. case R.id.volley_get://get请求
  73. get();
  74. break;
  75. case R.id.volley_post://post请求
  76. post();
  77. break;
  78. case R.id.volley_json://json请求 JsonObjectRequest{} JsonArrayRequest[]
  79. json();
  80. break;
  81. case R.id.volley_imageRequest://imageRequest加载图片
  82. image();
  83. break;
  84. case R.id.volley_imageLader://imageLader加载图片
  85. imageLoader();
  86. break;
  87. case R.id.netWorkImageView:
  88. netWorkImageView();
  89. break;
  90. default:
  91. break;
  92. }
  93. }
  94. /**
  95. * get
  96. */
  97. public void get(){
  98. //创建一个请求队列
  99. requestQueue = Volley.newRequestQueue(MainActivity.this);
  100. //创建一个请求
  101. String url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
  102. StringRequest stringRequest =new StringRequest(url, new Response.Listener <String>() {
  103. //正确接收数据回调
  104. @Override
  105. public void onResponse(String s) {
  106. try {
  107. JSONObject jsonObject = new JSONObject(s);
  108. // TestData testData= new Gson().fromJson(s, TestData.class);
  109. // Log.e(TAG,"length="+jsonObject.getJSONObject("trailers").length());
  110. // for (int i = 0;i <jsonObject.getJSONObject("trailers").length();i++){
  111. volley_result.setText(s);
  112. Log.e(TAG,"s="+jsonObject.getJSONArray("trailers").get(0)+"\n");
  113. // }
  114. } catch (JSONException e) {
  115. e.printStackTrace();
  116. }
  117. }
  118. }, new Response.ErrorListener() {//异常后的监听数据
  119. @Override
  120. public void onErrorResponse(VolleyError volleyError) {
  121. volley_result.setText("加载错误"+volleyError);
  122. }
  123. });
  124. //将get请求添加到队列中
  125. requestQueue.add(stringRequest);
  126. }
  127. /**
  128. * post
  129. */
  130. private void post(){
  131. //创建一个请求队列
  132. requestQueue = Volley.newRequestQueue(MainActivity.this);
  133. //创建一个请求
  134. String url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
  135. StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
  136. @Override
  137. public void onResponse(String s) {
  138. volley_result.setText(s);
  139. }
  140. }, new Response.ErrorListener() {
  141. @Override
  142. public void onErrorResponse(VolleyError volleyError) {
  143. volley_result.setText("加载错误"+volleyError);
  144. }
  145. }){
  146. @Override
  147. protected Map <String, String> getParams() throws AuthFailureError {
  148. Map <String,String> map = new HashMap <>();
  149. // map.put("value1","param1");//传入参数
  150. return map;
  151. }
  152. };
  153. //将post请求添加到队列中
  154. requestQueue.add(stringRequest);
  155. }
  156. /**
  157. * json
  158. */
  159. private void json(){
  160. //创建一个请求队列
  161. requestQueue = Volley.newRequestQueue(MainActivity.this);
  162. //创建一个请求
  163. String url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
  164. JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener <JSONObject>() {
  165. @Override
  166. public void onResponse(JSONObject jsonObject) {
  167. //TestData data = new Gson().fromJson(String.valueOf(jsonObject),TestData.class);
  168. volley_result.setText(jsonObject.toString());
  169. Log.e(TAG,"data="+jsonObject);
  170. }
  171. }, new Response.ErrorListener() {
  172. @Override
  173. public void onErrorResponse(VolleyError volleyError) {
  174. volley_result.setText("加载错误"+volleyError);
  175. }
  176. });
  177. //将创建的请求添加到队列中
  178. requestQueue.add(jsonObjectRequest);
  179. }
  180. /**
  181. * 加载图片
  182. */
  183. private void image(){
  184. //创建一个请求队列
  185. requestQueue = Volley.newRequestQueue(MainActivity.this);
  186. //创建一个请求
  187. String url = "http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg";
  188. //第二个参数,第三个:宽高,第四个:图片质量
  189. ImageRequest imageRequest = new ImageRequest(url, new Response.Listener <Bitmap>() {
  190. @Override
  191. public void onResponse(Bitmap bitmap) {
  192. //正确接收图片
  193. volley_image.setImageBitmap(bitmap);
  194. }
  195. }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
  196. @Override
  197. public void onErrorResponse(VolleyError volleyError) {
  198. volley_image.setImageResource(R.mipmap.ic_launcher);
  199. }
  200. });
  201. //将创建的请求添加到队列中
  202. requestQueue.add(imageRequest);
  203. }
  204. /**
  205. * imageLoader
  206. */
  207. private void imageLoader(){
  208. //创建一个请求队列
  209. requestQueue = Volley.newRequestQueue(MainActivity.this);
  210. //创建一个请求
  211. // ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
  212. // @Override
  213. // public Bitmap getBitmap(String s) {
  214. // return null;
  215. // }
  216. //
  217. // @Override
  218. // public void putBitmap(String s, Bitmap bitmap) {
  219. //
  220. // }
  221. // });
  222. ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());//带缓存
  223. //加载图片
  224. String url = "http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg";
  225. //加载不到,加载失败
  226. ImageLoader.ImageListener imageLister = imageLoader.getImageListener(volley_imageNet,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
  227. imageLoader.get(url,imageLister);
  228. }
  229. /**
  230. * netWorkImageView
  231. */
  232. private void netWorkImageView(){
  233. //创建一个请求队列
  234. requestQueue = Volley.newRequestQueue(MainActivity.this);
  235. //创建一个imageLoader
  236. ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());
  237. //默认图片设置
  238. volley_imageNet.setImageResource(R.mipmap.ic_launcher);
  239. //加载图片
  240. String url = "http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg";
  241. volley_imageNet.setImageURI(url,imageLoader);
  242. }
  243. @Override
  244. protected void onStop() {
  245. super.onStop();
  246. //取消队列里所有的请求
  247. requestQueue.cancelAll(this);
  248. }
  249. @Override
  250. protected void onDestroy() {
  251. super.onDestroy();
  252. }
  253. }
实现效果图片和代码下载地址: http://download.csdn.net/detail/u011324501/9725043










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值