什么是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);
}
});
}
}

运行结果:

Android笔记(六十二)网络框架volley的更多相关文章

  1. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  2. Android笔记(十二)AndroidManiFest.xml

    AndroidManiFest.xml清单文件是每个Android项目所必须的,它是整个Android应用的全局描述文件.AndroidManiFest.xml清单文件说明了该应用的名称.所使用的图标 ...

  3. 论文阅读笔记六十二:RePr: Improved Training of Convolutional Filters(CVPR2019)

    论文原址:https://arxiv.org/abs/1811.07275 摘要 一个训练好的网络模型由于其模型捕捉的特征中存在大量的重叠,可以在不过多的降低其性能的条件下进行压缩剪枝.一些skip/ ...

  4. Android笔记(七十二) Style和Theme

    我们尝尝需要使用setText.setColor.setTextSize等属性来设置控件的样式,但是每个控件都需要设置这些属性,工作量无疑是巨大的,并且后期维护起来也不方便. Style Androi ...

  5. Android笔记(六十九) 仿微信界面(一)

          综合之前的Fragment和自定义组件的知识,实现微信界面 MainActivity.java package cn.lixyz.test; import android.app.Acti ...

  6. Android笔记(六十八) Fragment总结

    Fragment的产生: 为了适应各种尺寸的屏幕,谷歌推出Fragment,可以把Fragment成Activity的一个组成部分,它拥有自己的生命周期.可以接收并处理用户的各种事件,还可以动态的增删 ...

  7. Android笔记(六十六) android中的动画——XML文件定义属性动画

    除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在 ...

  8. Android笔记(六十五) android中的动画——属性动画(propertyanimation)

    补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(prope ...

  9. Android笔记(六十四) android中的动画——补间动画(tweened animation)

    补间动画就是只需要定义动画开始和结束的位置,动画中间的变化由系统去补齐. 补间动画由一下四种方式: 1.AplhaAnimation——透明度动画效果 2.ScaleAnimation ——缩放动画效 ...

随机推荐

  1. [转]c++ pthread 多线程简介

    链接:https://blog.csdn.net/u013894427/article/details/83827173 pthread 入口函数类型说明void * func1(void * t)v ...

  2. (2)PyCharm开发Flash项目之蓝图构建

    下面通过在PyCharm开发工具中创建一个简单的Flask项目来体会一下Flask的蓝图构建(Blueprint). 何谓蓝图:在Flask中蓝图就在大型应用中,将不同功能的模块(module)分开管 ...

  3. Nginx 配置 HTTPS SSL 代理

    配置文件如下: #user nobody; worker_processes 1; events { worker_connections 1024; } http { include mime.ty ...

  4. svg复用方式<g>, <defs>, <symbol>, <use>

    svg复用元素的方式主要有 <g>, <defs>, <symbol>, <use> 1. <g> group, 分组,定义一组元素,初始不 ...

  5. EIGENSTRAT计算PCA的显著性

    之前我写过一篇文章群体遗传分析分层校正,该选用多少个PCA?,里面提到可以通过EIGENSTRAT软件确定显著的主成分,后续就可以将显著的主成分加入协变量中. 这篇文章主要是讲如何通过EIGENSTR ...

  6. NI MAX中缺少串口(转)

    Software Measurement & Automation Explorer (MAX) Driver NI-VISA     问题详述 在NI MAX中,设备和接口中的串口不可用或缺 ...

  7. EasyDSS高性能RTMP、HLS(m3u8)、FLV、RTSP流媒体服务器运行遇到getpwnam(_xxxxx_)错误的解决办法

    EasyDSS RTMP流媒体服务器是什么? EasyDarwin如何支持点播和RTMP/HLS直播?EasyDSS! getpwnam("xxxxx") 近期有EasyDSS流媒 ...

  8. LODOP条码二维码简短问答及相关博文

    LODOP如何输出条码 条码输出 参考样例11 http://www.c-lodop.com/demolist/PrintSample11.html超文本表格中的条码参考样例47 http://www ...

  9. sftp服务器的搭建

    ## 搭建前言:   主机系统:centos7   由于sftp基于ssh协议,所以我们无需安装多余的包,只需要进行相应的配置即可.   ## 搭建过程:   1. 创建用户.用户组,设置目录权限等( ...

  10. csp联考T1

    本题主要难点在于如何处理dist^2的问题 40分算法 n^2暴力就不必多嘴,直接枚举根节点DFS就行了. 70分算法 对于b=0的情况,我们可以考虑用换根法来计算根节点的变化对总权值带来的影响. 换 ...