【Volley网络框架】的简单使用
来源:互联网 发布:软件服务行业的利润率 编辑:程序博客网 时间:2024/05/29 11:06
先来介绍一下Volley网络框架使用的流程:
1、Volley进行网络请求统一管理,RequestQueue
2、发起请求,StringRequest(分为GET,POST请求 后面会一一介绍),ImageRequest,JSONObjectRequest
3、将请求添加到请求队列
此Demo中所用到的网络请求!(只是几个简单的Button,就不往出列xml文件了...)
1.get请求获取数据:
case R.id.btnGetString: String stringUrl = "http://www.baidu.com"; request = new StringRequest( Request.Method.GET,//请求方式 stringUrl,//地址 new Response.Listener<String>() {//请求成功回调 @Override public void onResponse(String response) { //对数据进行解析,刷新适配器,展示数据 Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_SHORT).show(); Log.d("flag", "----------------->onResponse: Get请求获取的数据: " + response); } }, new Response.ErrorListener() {//请求失败的回调 @Override public void onErrorResponse(VolleyError error) { //网络不好,提示用户,从缓存中获取数据 Toast.makeText(MainActivity.this, "Failure", Toast.LENGTH_SHORT).show(); Log.d("flag", "----------------->onErrorResponse: Get请求失败: " + error.getMessage()); } }); break;
2.post请求获取数据:
case R.id.btnPostString: request = new StringRequest(Request.Method.POST, mStringPostUrl, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject result = new JSONObject(response); } catch (JSONException e) { e.printStackTrace(); } Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_SHORT).show(); Log.d("flag", "----------------->onResponse: POST请求获取数据: " + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this, "Failure", Toast.LENGTH_SHORT).show(); Log.d("flag", "----------------->onErrorResponse: POST请求失败:" + error.getMessage()); //断网的情况下获取数据 String类型数据(Json) //从缓存中获取数据 Cache cache = mRequestQueue.getCache(); if (cache != null) { Cache.Entry entry = cache.get(mStringPostUrl); if (entry != null) { byte[] data = entry.data; String result = new String(data); //TODO JSON解析,刷新适配器,ListView展示数据 Log.d("flag", "----------------->onErrorResponse: 断网下获取的缓存数据: " + result); } } } }) {//重写StringRequest的方法 //Ctrl+O //params---->参数,请求参数:cateid=0;p = 1; @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> map = new HashMap<>(); map.put("catied", "0"); map.put("p", "1"); return map; } }; break;
3.图片的请求
case R.id.btnImage: request = new ImageRequest(mImageUrl, new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_SHORT).show(); mImageView.setImageBitmap(response); Log.d("flag", "----------------->onResponse: 图片的尺寸, width: " + response.getWidth() + ",height: " + response.getHeight()); } }, //图片的缩放,压缩 300,//宽度的最大值,0,不进行缩放 400, //高度的最大值,0,不进行缩放 ImageView.ScaleType.FIT_XY, Bitmap.Config.RGB_565, //Bitmap生成的配置格式 new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this, "Failure", Toast.LENGTH_SHORT).show(); mImageView.setImageResource(R.mipmap.ic_launcher); Log.d("flag", "----------------->onErrorResponse: 图片获取失败 " + error.getMessage()); } }); break;
4.从缓存中获取图片
case R.id.btnCache://获取PostString //1、通过请求队列获取缓存 Cache cache = mRequestQueue.getCache(); if (cache != null) { Cache.Entry entry = cache.get(mImageUrl); if (entry != null) { //获取entry中数据 byte[] data = entry.data;// String result = new String(data);// result = data.toString();内存地址 Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show();// Log.d("flag", "----------------->volley: 缓存中数据: " + result); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); mImageView.setImageBitmap(bitmap); } else { Toast.makeText(this, "具体的网址没有缓存数据", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(this, "没有缓存对象", Toast.LENGTH_SHORT).show(); } break;
5.post请求方式 获取字符串
case R.id.btnJson: String jsonUrl = "http://api.m.mtime.cn/PageSubArea/HotPlayMovies.api"; JSONObject params = new JSONObject(); try { params.put("locationId", "290"); } catch (JSONException e) { e.printStackTrace(); } request = new JsonObjectRequest(Request.Method.POST, jsonUrl, params,//如果是GET请求,null new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { //TODO 直接进行解析,方便操作 Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_SHORT).show(); Log.d("flag", "----------------->onResponse: 获取的JSON数据是: " + response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("flag", "----------------->onErrorResponse: " + error.getMessage()); Toast.makeText(MainActivity.this, "Failure", Toast.LENGTH_SHORT).show(); } }); break;
6.获取缓存中的图片
case R.id.btnImageLoader: //参数二,内存缓存 运行内存 ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() { //内存缓存LruCache链表 LruCache<String, Bitmap> lruCache = new LruCache<String, Bitmap>((int) (Runtime.getRuntime().maxMemory() / 8)) { @Override protected int sizeOf(String key, Bitmap value) {// value.getRowBytes()*value.getHeight(); return value.getByteCount();// } }; @Override public Bitmap getBitmap(String url) { return lruCache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { lruCache.put(url, bitmap); } }); imageLoader.get(mImageUrl, new ImageLoader.ImageListener() { @Override public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { Bitmap bitmap = response.getBitmap(); mImageView.setImageBitmap(bitmap); } @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this, "请求图片失败", Toast.LENGTH_SHORT).show(); } }, 256, 360, ImageView.ScaleType.CENTER_CROP); break;
最重要的一行代码:
if (request != null) { mRequestQueue.add(request);}
下面的是一些是 自定义的RequestQueue和ImageLoader
(如果不想修改缓存的位置可以跳过)
1.自定义的VolleyUtils
public class VolleyUtils { //线程安全--->恶汉式 private static VolleyUtils ourInstance; private RequestQueue mRequestQueue; private ImageLoader mImageLoader; public RequestQueue getRequestQueue() { return mRequestQueue; } public ImageLoader getImageLoader() { return mImageLoader; } //公有访问方法 public static VolleyUtils getInstance(Context context) { if (ourInstance == null) {//线程不安全的问题 synchronized (VolleyUtils.class) { if (ourInstance == null) { ourInstance = new VolleyUtils(context); } } } return ourInstance; } //私有的构造方法 private VolleyUtils(Context context) { //创建RequestQueue,ImageLoader File cacheDir = context.getCacheDir();//data/data/包名/cache/XXX //sd卡下的Android/包名/files/images File rootDirectory = context.getExternalFilesDir("images"); Cache cache = new DiskBasedCache(rootDirectory, 100 << 20);//100M 1024 = 2的十次方 Network network = getNetwork(); mRequestQueue = new RequestQueue(cache, network, 4); mRequestQueue.start();//必须调用,不然没有网络请求 //ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() { LruCache<String, Bitmap> mLruCache = new LruCache<String, Bitmap>((int) (Runtime.getRuntime().maxMemory() / 8)) { //该方法,不重写,15×1024×1024 @Override protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); } }; @Override public Bitmap getBitmap(String url) { return mLruCache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { mLruCache.put(url, bitmap); } }); } private Network getNetwork() { Network network = null; if (Build.VERSION.SDK_INT >= 9) { network = new BasicNetwork(new HurlStack());//HttpUrlConnection,标准的网络请求 } else { //如果api小于9,使用httpClient进行网络请求 network = new BasicNetwork(new HttpClientStack(new DefaultHttpClient())); } return network; }}
2.main方法进行实现
public class VolleyActivity extends AppCompatActivity { private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_volley); mRequestQueue = VolleyUtils.getInstance(this).getRequestQueue(); mImageLoader = VolleyUtils.getInstance(this).getImageLoader(); mImageView = (ImageView) findViewById(R.id.image); } public void volley(View view) { String url = "http://www.qq.com"; final StringRequest request = new StringRequest(url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("flag", "----------------->onResponse: 自定义的RequestQueue获取数据" + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("flag", "----------------->onErrorResponse: 失败" + error.getMessage()); } }); mRequestQueue.add(request); String imageUrl = "http://img01.taopic.com/150305/318754-15030510213437.jpg"; mImageLoader.get(imageUrl, new ImageLoader.ImageListener() { @Override public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { mImageView.setImageBitmap(response.getBitmap()); } @Override public void onErrorResponse(VolleyError error) { mImageView.setImageResource(R.mipmap.ic_launcher); } }); }}
只是一只刚接触Volley框架的菜鸟,写了一个Demo,还是有很多收获的
知至者不如好知者,好知者不如乐知者!
1 0
- Volley网络框架的简单使用
- 【Volley网络框架】的简单使用
- 安卓网络框架---volley的简单使用。
- Android网络请求框架:Volley简单使用
- volley框架的简单使用
- Volley框架的简单使用
- Android Volley网络通信框架的使用(一):Volley的简单用法
- Android网络框架Volley的快速使用
- Android网络请求框架Volley的使用
- Android Volley网络框架的基本使用
- android网络请求Volley框架的使用
- Volley网络请求框架的使用
- Android网络Volley框架的使用
- volley框架网络获取的使用
- Volley网络请求的简单封装使用
- Volley的简单使用--请求网络
- Android使用Google推荐的联网框架Volley,让连接网络更加简单
- android Volley请求框架的简单使用——访问网络和加载图片
- 入门级概述光学相干层析(OCT)原理
- ZOJ
- 商品展示案例
- HTML5元素与标签
- Android学习(3)
- 【Volley网络框架】的简单使用
- Linux 内核模块开发
- js初步笔记
- 详细讲解如何在MFC单/多文档中创建多视图(具体代码)
- 千字文
- TCP/IP详解--再次深入理解TCP网络编程中的send和recv
- 学习了ajax传值到另一个页面
- DivideingJewels
- Spring 之依赖注入DI