Android - 使用Volley请求网络数据

Android L ; Android Studio 14

个人使用volley的小记,简述使用方法,不涉及volley源码

准备工作

导入Volley.jar包:我使用的是现成的jar包,将其放到app/libs目录下即可
网上可以下载到Volley.jar包

使用volley源代码

从github上pull一个下来
git pull https://github.com/mcxiaoke/android-volley.git

把这个文件夹放到工程中,与app目录同级

ImportTest/
├── app
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── ImportTest.iml
├── local.properties
├── settings.gradle
└── volley

在android studio中,编辑ImportTest/settings.gradle,加入':volley'

include ':app',':volley'

编辑ImportTest/app/build.gradle;在dependencies中加入compile project(':volley')

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':volley')//加进来
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
}

同步一下gradle;可能会错:Gradle sync failed: SSL peer shut down incorrectly

找到这个地方volley/build.gradle,注释掉这两句

//apply from: 'https://raw.github.com/mcxiaoke/gradle-mvn-push/master/jar.gradle'
//apply from: 'https://raw.github.com/mcxiaoke/gradle-mvn-push/master/gradle-mvn-push.gradle'

使用volley

导入jar包已经完成,接下来需要:

  • 申请网络权限 <uses-permission android:name="android.permission.INTERNET"/>
  • 建立网络请求队列 RequestQueue
  • 准备Url
  • 请求数据

主要代码在VolleyTest.java中,新建了一个LinearLayout来显示数据
加载String,图片,JSON数据;能够实现异步加载网络图片

VolleyTest.java

        /* 用于显示的控件 */
        cityName = (TextView) findViewById(R.id.city_name);
        temper = (TextView) findViewById(R.id.temper);
        weatherType = (TextView) findViewById(R.id.weather_type);
        webText = (TextView) findViewById(R.id.web_text);
        cat = (ImageView) findViewById(R.id.image_cat);
        wallpaper = (NetworkImageView) findViewById(R.id.image_wallpaper);

        /* 0.准备url,放到HashMap中备用 */
        Map<String, String> sourceUrl = new HashMap<>();/* store url */
        sourceUrl.put("beijing", "http://www.weather.com.cn/adat/cityinfo/101010100.html");
        sourceUrl.put("cat_earphone", "http://pic.cnblogs.com/avatar/706293/20150628195334.png");
        sourceUrl.put("wallpaper0010",
                "http://s.cn.bing.net/az/hprichbg/" +
                        "rb/MaroonBellsVideo_ZH-CN9667920788_1920x1080.jpg");

        /* 1.建立RequestQueue */
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());/* context */

        /* 2.请求JSON文件;这里利用的是天气预报接口 */
        JsonObjectRequest jsonRequest = new JsonObjectRequest(sourceUrl.get("beijing"), null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject jsonObject) {
                        Log.d("rust", jsonObject.toString());
                        /* 2.1处理JSON文件 */
                        try {
                            JSONObject weather = jsonObject.getJSONObject("weatherinfo");
                            cityName.setText(weather.getString("city"));
                            StringBuilder temperRange = new StringBuilder();
                            temperRange.append(weather.getString("temp1"));
                            temperRange.append(" ~ ");
                            temperRange.append(weather.getString("temp2"));
                            temper.setText(temperRange.toString());
                            weatherType.setText(weather.getString("weather"));
                        } catch (JSONException e) {
                            e.printStackTrace();
                            cityName.setText("ERROR");
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.e("rust", volleyError.toString());
            }
        });
        /* 不要忘记添加到队列中 */
        requestQueue.add(jsonRequest);/* add to request queue */

        /* 3.请求网络图片 */
        ImageRequest catRequest = new ImageRequest(sourceUrl.get("cat_earphone"),
                new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap bitmap) {
                        cat.setImageBitmap(bitmap);
                    }
                }, 0, 0, Bitmap.Config.RGB_565,
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        Log.e("rust", volleyError.toString());
                    }
                }
        );
        requestQueue.add(catRequest);/* add to request queue */

        /* 3.1异步加载图片 */
        ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
        ImageLoader.ImageListener listener = ImageLoader.getImageListener(
                wallpaper, R.drawable.orange01, R.drawable.orange02
        );/* ImageView,默认显示图片,加载失败后显示的图片*/
        imageLoader.get(sourceUrl.get("wallpaper0010"), listener, 400, 400);/* 可指定图片最大尺寸 */
        wallpaper.setImageUrl(sourceUrl.get("wallpaper0010"), imageLoader); /* 显示图片 */

        /* 4.获取文本,以获取网站文本为例 */
        StringRequest stringRequest = new StringRequest(
                "http://www.cnblogs.com/",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        webText.setText(response);
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("TAG", error.getMessage(), error);
            }
        });
        requestQueue.add(stringRequest);

BitmapCache.java

import android.graphics.Bitmap;
import android.util.LruCache;

import com.android.volley.toolbox.ImageLoader;

public class BitmapCache implements ImageLoader.ImageCache {

    private LruCache<String, Bitmap> mCache;

    public BitmapCache() {
        int maxSize = 10 * 1024 * 1024;/* 10M */
        mCache = new LruCache<String, Bitmap>(maxSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                return bitmap.getRowBytes() * bitmap.getHeight();
            }
        };
    }

    @Override
    public Bitmap getBitmap(String url) {
        return mCache.get(url);
    }

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

}

final

Volley是一个不错的网络框架,源代码可以在frameworks/volley中找到

这里的代码仅仅是实现功能;具体使用中会发现,解析JSON时可能会出现乱码,受网络影响JSON可能加载很慢

Android - 使用Volley请求网络数据的更多相关文章

  1. 解决Volley请求网络数据返回的数据乱码

    本人可参考http://tieba.baidu.com/p/4039693566 以往一般我们如下写就可以了 StringRequest request=new StringRequest(url, ...

  2. Android训练课程(Android Training) - 使用Volley传输网络数据(Transmitting Network Data Using Volley)

    使用Volley传输网络数据(Transmitting Network Data Using Volley) Volley 是一个 HTTP 库,它使得在Android应用程序中操作网络更容易,是重要 ...

  3. Android 手机卫士--构建服务端json、请求网络数据

    本文地址:http://www.cnblogs.com/wuyudong/p/5900384.html,转载请注明源地址. 数据的传递 客户端:发送http请求 http://www.oxx.com/ ...

  4. Android利用Fiddler进行网络数据抓包

    最新最准确内容建议直接访问原文:Android利用Fiddler进行网络数据抓包 主要介绍Android及IPhone手机上如何进行网络数据抓包,比如我们想抓某个应用(微博.微信.墨迹天气)的网络通信 ...

  5. Android利用Fiddler进行网络数据抓包,手机抓包工具汇总

    Fiddler抓包工具 Fiddler抓包工具很好用的,它可以干嘛用呢,举个简单例子,当你浏览网页时,网页中有段视频非常好,但网站又不提供下载,用迅雷下载你又找不到下载地址,这个时候,Fiddler抓 ...

  6. Android利用Fiddler进行网络数据抓包,手机抓包工具汇总,使用mono运行filddler

    Fiddler抓包工具 Fiddler抓包工具很好用的,它可以干嘛用呢,举个简单例子,当你浏览网页时,网页中有段视频非常好,但网站又不提供下载,用迅雷下载你又找不到下载地址,这个时候,Fiddler抓 ...

  7. react-native 项目实战 -- 新闻客户端(4) -- 请求网络数据

    1.Home.js /** * 首页 */ import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Te ...

  8. Android利用Fiddler进行网络数据抓包【怎么跟踪微信请求】

    主要介绍Android及IPhone手机上如何利用Fiddler进行网络数据抓包,比如我们想抓某个应用(微博.微信.墨迹天气)的网络通信请求就可以利用这个方法. Mac 下请使用 Charles 代替 ...

  9. [Android Traffic] 让android应用在传输网络数据的时候更省电

    到今年6月,我国的手机网民已经达到了3.88亿,超过了电脑终端.相信有智能机的同学都用过手机上网冲浪.但是手机的电量很快被用光了恐怕是每个人都不能忍受的一件事情.而打开数据连接进行网络数据的传输是很耗 ...

随机推荐

  1. 搭建arm交叉工具链

    1.将arm-linux-gcc-4.4.3压缩包,拷到home/armtoolchain下,进行压缩. 2.压缩命令:tar -xzvf arm-linux-gcc-4.4.3.tgz,解压后得到了 ...

  2. lucene全文搜索之一:lucene的主要功能和基本结构(基于lucene5.5.3)

    前言:lucene并不是像solr或elastic那样提供现成的.直接部署可用的系统,而是一套jar包,提供了一些常见语言分词.构建索引和创建搜索器等等功能的API,我们常用到的也就是分词器.索引目录 ...

  3. android进入adb shell步骤及修改sqlite数据库文件的权限

    1 准备工作 (1)将adb.exe从  \Sdk\platform-tools目录下移动到 \Sdk\tools目录下(主要是看emulator这几个文件在哪个文件夹就把adb.exe移动到哪个文件 ...

  4. 使用可视化图表对 Webpack 2 的编译与打包进行统计分析

    此文主要对使用可视化图表对 Webpack 2 的编译与打包进行统计分析进行了详细地讲解,供您更加直观地参考. 在之前更新的共十七章节中,我们陆续讲解了 Webpack 2 从配置到打包.压缩优化到调 ...

  5. JVM高级特性-二、JVM在堆中对象的分配、布局、访问过程

    前面介绍了jvm运行时数据区域后,下面讲解下对内存中数据的其他细节,看他们是如何创建.布局及访问的 一.对象的创建 1.对象的分配 对象的创建分配方式主要有两种:指针碰撞和空闲列表 指针碰撞: 假设堆 ...

  6. 在Ubuntu中设置DNS域名服务器端

    在Ubuntu中设置DNS域名服务器主要有四种方法: 一.设置全局静态DNS $ sudo vi /etc/resolvconf/resolv.conf.d/base(这个文件默认是空的),插入: n ...

  7. JavaScript面向对象之Windows对象

    JavaScript之Window对象 首先我们先了解一个概念:事件. 事件,就是把一段代码设置好,满足条件时触发.或者说,事件是可以被 JavaScript 侦测到的行为. 网页中每个元素都可以触发 ...

  8. centos ios镜像文件 安装详细

    1.挂载iOS镜像(先打开VM 选择虚拟机---->设置-->CD ---->使用ISO镜像文件 用浏览打开) 2.开始界面选择 3出现下面的界面 这是提示你是否扫描文件的完整性 我 ...

  9. 一步一步教你将开源项目上传到jcenter

    最近闲着看了一下jcenter的使用,也想将自己使用频率比较高的东西抽成类库,然后通过compile来使用,提高开发效率,本来以为挺简单的,但是网上介绍的比较模糊,很多博客也比较老了,不适用,花了我一 ...

  10. Discuz更改默认搜索模块

    由于网站使用DZ的侧重点不同,在搜索中可能需要更改默认搜索模块 首先找到模板中搜索模块对应的文件,默认模板中搜索模块的地址是 template\default\common\pubsearchform ...