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. StringRequest stringRequest =new StringRequest(url, new Response.Listener <String>() {
  102. //正确接收数据回调
  103. @Override
  104. public void onResponse(String s) {
  105. try {
  106. JSONObject jsonObject = new JSONObject(s);
  107. // TestData testData= new Gson().fromJson(s, TestData.class);
  108. // Log.e(TAG,"length="+jsonObject.getJSONObject("trailers").length());
  109. // for (int i = 0;i <jsonObject.getJSONObject("trailers").length();i++){
  110. volley_result.setText(s);
  111. Log.e(TAG,"s="+jsonObject.getJSONArray("trailers").get(0)+"\n");
  112. // }
  113. } catch (JSONException e) {
  114. e.printStackTrace();
  115. }
  116. }
  117. }, new Response.ErrorListener() {//异常后的监听数据
  118. @Override
  119. public void onErrorResponse(VolleyError volleyError) {
  120. volley_result.setText("加载错误"+volleyError);
  121. }
  122. });
  123. //将get请求添加到队列中
  124. requestQueue.add(stringRequest);
  125. }
  126. /
  127. post
  128. /
  129. private void post(){
  130. //创建一个请求队列
  131. requestQueue = Volley.newRequestQueue(MainActivity.this);
  132. //创建一个请求
  133. StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
  134. @Override
  135. public void onResponse(String s) {
  136. volley_result.setText(s);
  137. }
  138. }, new Response.ErrorListener() {
  139. @Override
  140. public void onErrorResponse(VolleyError volleyError) {
  141. volley_result.setText("加载错误"+volleyError);
  142. }
  143. }){
  144. @Override
  145. protected Map <String, String> getParams() throws AuthFailureError {
  146. Map <String,String> map = new HashMap <>();
  147. // map.put("value1","param1");//传入参数
  148. return map;
  149. }
  150. };
  151. //将post请求添加到队列中
  152. requestQueue.add(stringRequest);
  153. }
  154. /
  155. json
  156. /
  157. private void json(){
  158. //创建一个请求队列
  159. requestQueue = Volley.newRequestQueue(MainActivity.this);
  160. //创建一个请求
  161. JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener <JSONObject>() {
  162. @Override
  163. public void onResponse(JSONObject jsonObject) {
  164. //TestData data = new Gson().fromJson(String.valueOf(jsonObject),TestData.class);
  165. volley_result.setText(jsonObject.toString());
  166. Log.e(TAG,"data="+jsonObject);
  167. }
  168. }, new Response.ErrorListener() {
  169. @Override
  170. public void onErrorResponse(VolleyError volleyError) {
  171. volley_result.setText("加载错误"+volleyError);
  172. }
  173. });
  174. //将创建的请求添加到队列中
  175. requestQueue.add(jsonObjectRequest);
  176. }
  177. /
  178. 加载图片
  179. /
  180. private void image(){
  181. //创建一个请求队列
  182. requestQueue = Volley.newRequestQueue(MainActivity.this);
  183. //创建一个请求
  184. //第二个参数,第三个:宽高,第四个:图片质量
  185. ImageRequest imageRequest = new ImageRequest(url, new Response.Listener <Bitmap>() {
  186. @Override
  187. public void onResponse(Bitmap bitmap) {
  188. //正确接收图片
  189. volley_image.setImageBitmap(bitmap);
  190. }
  191. }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
  192. @Override
  193. public void onErrorResponse(VolleyError volleyError) {
  194. volley_image.setImageResource(R.mipmap.ic_launcher);
  195. }
  196. });
  197. //将创建的请求添加到队列中
  198. requestQueue.add(imageRequest);
  199. }
  200. /
  201. imageLoader
  202. /
  203. private void imageLoader(){
  204. //创建一个请求队列
  205. requestQueue = Volley.newRequestQueue(MainActivity.this);
  206. //创建一个请求
  207. // ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
  208. // @Override
  209. // public Bitmap getBitmap(String s) {
  210. // return null;
  211. // }
  212. //
  213. // @Override
  214. // public void putBitmap(String s, Bitmap bitmap) {
  215. //
  216. // }
  217. // });
  218. ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());//带缓存
  219. //加载图片
  220. //加载不到,加载失败
  221. ImageLoader.ImageListener imageLister = imageLoader.getImageListener(volley_imageNet,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
  222. imageLoader.get(url,imageLister);
  223. }
  224. /*
  225. * netWorkImageView
  226. */
  227. private void netWorkImageView(){
  228. //创建一个请求队列
  229. requestQueue = Volley.newRequestQueue(MainActivity.this);
  230. //创建一个imageLoader
  231. ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());
  232. //默认图片设置
  233. volley_imageNet.setImageResource(R.mipmap.ic_launcher);
  234. //加载图片
  235. volley_imageNet.setImageURI(url,imageLoader);
  236. }
  237. @Override
  238. protected void onStop() {
  239. super.onStop();
  240. //取消队列里所有的请求
  241. requestQueue.cancelAll(this);
  242. }
  243. @Override
  244. protected void onDestroy() {
  245. super.onDestroy();
  246. }
  247. }

实现效果图片和代码下载地址: http://download.csdn.net/detail/u011324501/9725043




猜你喜欢

转载自blog.csdn.net/GuoXuan_CHN/article/details/81131412
今日推荐