学习使用Volley的多种基本功能-来自官方文档

官方文档地址:https://developer.android.com/training/volley/requestqueue.html

之前一直没看到这个,原来官方已经正式有关于Volley的文档了,而且这是被建议使用的Network库。

因为之前有写过简单的Volley请求怎么写,下面介绍的都是我之前不知道的用法:

1.先上代码:

 1 Cache cache = new DiskBasedCache(getCacheDir(),1024*1024);
 2         Network network = new BasicNetwork(new HurlStack());
 3         RequestQueue requestQueue = new RequestQueue(cache,network);
 4         requestQueue.start();
 5         StringRequest stringRequest = new StringRequest(Request.Method.GET,"http://www.baidu.com",new Response.Listener<String>() {
 6             @Override
 7             public void onResponse(String s) {
 8                 Log.i("TAG",s);
 9             }
10         },new Response.ErrorListener() {
11             @Override
12             public void onErrorResponse(VolleyError volleyError) {
13                 Log.e("TAG",""+volleyError);
14             }
15         });
16
17         requestQueue.add(stringRequest);

这时,我们看到,建立了一个缓存区,同时使用了封装好的网络请求,注意,此时跟原来不同的问题来了,这里自定义的请求队列需要自己启动(start),其他操作相同。

2.使用一个单例来包装上述过程

public class MySingleton {
    private RequestQueue mRequestQueue;
    private static MySingleton mInstance;
    private ImageLoader mImageLoader;
    private Context mContext;

    private MySingleton(Context context){
        mContext = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,new ImageLoader.ImageCache() {

            private final LruCache<String,Bitmap> cache = new LruCache<>(20);

            @Override
            public Bitmap getBitmap(String s) {
                return cache.get(s);
            }

            @Override
            public void putBitmap(String s, Bitmap bitmap) {
                cache.put(s,bitmap);
            }
        });
    }

    public RequestQueue getRequestQueue() {
        if(mRequestQueue == null){
            mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());
        }
        return mRequestQueue;
    }

    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null){
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }

    public <T> void addToRequestQueue(Request<T> req){
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}

这样,就可以使用这个来请求很多不同的请求了,虽然在某些时候缓存不大有用。

3.如何加载图片请求

 1 public class MainActivity extends AppCompatActivity {
 2
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7
 8         final ImageView imageView = (ImageView)findViewById(R.id.image);
 9         String url = "http://p2.zhimg.com/10/7b/107bb4894b46d75a892da6fa80ef504a.jpg";
10
11         ImageRequest request = new ImageRequest(url,new Response.Listener<Bitmap>() {
12             @Override
13             public void onResponse(Bitmap bitmap) {
14                 imageView.setImageBitmap(bitmap);
15             }
16         },0,0,null,new Response.ErrorListener() {
17             @Override
18             public void onErrorResponse(VolleyError volleyError) {
19                 Log.i("TAG","Error");
20             }
21         });
22
23         MySingleton.getInstance(this).addToRequestQueue(request);
24     }
25 }

但是注意此时ImageRequest已经过期。

4.使用ImageLoader和ImageView

1 ImageLoader imageLoader = MySingleton.getInstance(this).getImageLoader();
2         imageLoader.get(url,ImageLoader.getImageListener(imageView,R.drawable.zhanwei,android.R.drawable.stat_notify_error));

5.使用ImageLoader和NetworkImageView(都由Volley提供)

1
2         String IMAGE_URL = "https://avatars0.githubusercontent.com/u/9381246?v=3&s=460";
3         NetworkImageView imageView = (NetworkImageView)findViewById(R.id.image);
4         ImageLoader imageLoader = MySingleton.getInstance(this).getImageLoader();
5
6         imageView.setImageUrl(IMAGE_URL,imageLoader);

6.自定义一些LruCache,并结合ImageCache

 1 public class LruBitmapCache extends LruCache<String,Bitmap> implements ImageLoader.ImageCache {
 2
 3     public LruBitmapCache(int maxSize) {
 4         super(maxSize);
 5     }
 6
 7     public LruBitmapCache(Context context){
 8         this(getCacheSize(context));
 9     }
10
11     public static int getCacheSize(Context context) {
12         final DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
13         final int screenWidth = displayMetrics.widthPixels;
14         final int screenHeight = displayMetrics.heightPixels;
15         final int screenBytes = screenHeight * screenWidth * 4;
16         return screenBytes*3;
17     }
18
19     @Override
20     protected int sizeOf(String key, Bitmap value) {
21         return value.getRowBytes() * value.getHeight();
22     }
23
24     @Override
25     public Bitmap getBitmap(String s) {
26         return get(s);
27     }
28
29
30     @Override
31     public void putBitmap(String s, Bitmap bitmap) {
32         put(s,bitmap);
33     }
34
35
36 }
1         ImageView imageView = (ImageView)findViewById(R.id.image);
2         String IMAGE_URL = "https://avatars0.githubusercontent.com/u/9381246?v=3&s=460";
3
4         RequestQueue requestQueue = MySingleton.getInstance(this).getRequestQueue();
5         ImageLoader imageLoader = new ImageLoader(requestQueue,new LruBitmapCache(this));
6         imageLoader.get(IMAGE_URL,ImageLoader.getImageListener(imageView,R.drawable.zhanwei,R.drawable.zhanwei));

还有Json的Request,以前介绍过了,就不再叙述了。

7.自定义Request

由于volley中实现了三种基本请求 : string / image / json的请求,所以除了这三种基本请求之外,你如果还想要请求其他数据,可以自定义Request。

下面是文档中的Gson请求的写法:

 1 public class GsonRequest<T> extends Request<T> {
 2
 3     private final Gson gson = new Gson();
 4     private final Class<T> clazz;
 5     private final Map<String,String> headers;
 6     private final Response.Listener<T> listener;
 7
 8     public GsonRequest(String url,Class<T>clazz,Map<String,String> headers,Response.Listener<T> listener, Response.ErrorListener errorListener) {
 9         super(Method.GET, url, errorListener);
10         this.clazz = clazz;
11         this.headers = headers;
12         this.listener = listener;
13     }
14
15     @Override
16     public Map<String, String> getHeaders() throws AuthFailureError{
17         return headers != null ? headers : super.getHeaders();
18     }
19
20     @Override
21     protected Response<T> parseNetworkResponse(NetworkResponse networkResponse) {
22         try{
23             String json = new String(networkResponse.data,
24                     HttpHeaderParser.parseCharset(networkResponse.headers));
25             return Response.success(gson.fromJson(json,clazz),
26                     HttpHeaderParser.parseCacheHeaders(networkResponse));
27         }catch (UnsupportedEncodingException|JsonSyntaxException e){
28             return Response.error(new ParseError());
29         }
30     }
31
32     @Override
33     protected void deliverResponse(T t) {
34         listener.onResponse(t);
35     }
36 }

Gson是google开发的一种(Gson is a Java library that can be used to convert Java Objects into their JSON representation.)用于Java类和Json格式相互转化的工具,项目地址https://code.google.com/p/google-gson/

时间: 2024-08-08 05:35:56

学习使用Volley的多种基本功能-来自官方文档的相关文章

MySQL学习 --来自官方文档的翻译

通用知识: 1.mysql>source path; path:要执行的sql路径 学会使用help content;里面会有详细的说明和例子 第一篇 字符集 1.基础知识 级别:服务器.数据库.表.属性 character set和collations 的区别 字符集:一组符号和其编码的集合 排序规则:符合编码的比较规则,最简单的比较规则是二进制排序规则. MySQL可以做的事情: 使用大量的字符集和排序规则组合来表示字符串,其应用水平可以在数据库.表.属性等级别. 然而要想知道如何高效利用M

Delivering touch events to a view outside the bounds of its parent view(来自官方文档)

Q: My view is displayed correctly on the screen, but does not receive any touch events. Why is that? A: The most common cause of this problem is because your view is located outside the bounds of its parent view. When your application receives a touc

NSRunLoop(来自官方文档)

The NSRunLoop class declares the programmatic interface to objects that manage input sources. An NSRunLoop object processes input for sources such as mouse and keyboard events from the window system, NSPort objects, and NSConnection objects. An NSRun

Jinja2学习笔记暨官方文档的翻译

http://blog.csdn.net/lgg201/article/details/4647471 呵呵, 刚刚看完Python模板引擎Jinja2的文档, 感觉很好, 觉得动态语言真是很好.  模板引擎竟然可以做的如此灵活....真是不错.... 下面直接把看文档过程的笔记发布出来, 呵呵, 基本上就是翻译, 加了不多的一点自己的解释......希望可以帮到大家 补充: 1. 在模板中设置自定义变量: {% set variable_name = value %} 比如设置{% set u

Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正)

Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正) 置顶 2017年12月08日 11:19:11 阅读数:20277 官方原文: https://docs.djangoproject.com/en/2.0/ 当前翻译版本: v2.0 Python版本要求: v3.4+ (译者注:本人目前在南京一家互联网公司工作,职位是测试开发工程师.因为测试工作中经常会用到编码语言,如Python.Java.Shell等,所以几年前萌生了对Python语法的学习.Django作为Python

从官方文档去学习之FreeMarker

一.前言 上一篇 <从现在开始,试着学会用官方文档去学习一个技术框架>提倡大家多去从官方文档学习技术,没有讲到具体的实践,本篇就拿一个案例具体的说一说,就是FreeMarker,选择这个框架没什么特别的含义,最近要用,就拿这个做个典型. 二.套路 上篇文章最后说到技术学习没有套路,无招胜有招,无招即是有招,解读一下实际上就是说 本身还是有些招式套路,但是要灵活运用,不要什么都往上套,应该忘掉固有的套路,让其化为你的一种本能,见招拆招.  下面就介绍一种常规学习套路给大家,如下图: 下面就根据上

Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC

在前面的文档中讲解了Spring MVC的特殊beans,以及DispatcherServlet使用的默认实现.在本部分,你会学习两种额外的方式来配置Spring MVC.分别是:MVC Java config 和  MVC XML namespace. 原文: Section 22.2.1, "Special Bean Types In the WebApplicationContext" and Section 22.2.2, "Default DispatcherSer

Spring 4 官方文档学习 Spring与Java EE技术的集成

本部分覆盖了一下内容: Chapter 28, Remoting and web services using Spring -- 使用Spring进行远程和web服务 Chapter 29, Enterprise JavaBeans (EJB) integration -- EJB集成 Chapter 30, JMS (Java Message Service) -- JMS (Java 消息服务) Chapter 31, JMX Chapter 32, JCA CCI Chapter 33,

Spring 4 官方文档学习(五)核心技术之SpEL

1.介绍 SpEL支持在runtime 查询.操作对象图. 2.功能概览 英文 中文 Literal expressions 字面值表达式 Boolean and relational operators 布尔和关系操作符 Regular expressions  正则表达式 Class expressions 类表达式 Accessing properties, arrays, lists, maps 访问properties.arrays.lists.maps Method invocati