Android - 使用Volley请求网络数据

简介: Android - 使用Volley请求网络数据Android L ; Android Studio 14个人使用volley的小记,简述使用方法,不涉及volley源码准备工作导入Volley.

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可能加载很慢

目录
相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
264 4
|
1天前
|
前端开发 小程序 Java
uniapp-网络数据请求全教程
这篇文档介绍了如何在uni-app项目中使用第三方包发起网络请求
10 3
|
2月前
|
安全 算法 网络安全
量子计算与网络安全:保护数据的新方法
量子计算的崛起为网络安全带来了新的挑战和机遇。本文介绍了量子计算的基本原理,重点探讨了量子加密技术,如量子密钥分发(QKD)和量子签名,这些技术利用量子物理的特性,提供更高的安全性和可扩展性。未来,量子加密将在金融、政府通信等领域发挥重要作用,但仍需克服量子硬件不稳定性和算法优化等挑战。
|
2月前
|
存储 安全 网络安全
云计算与网络安全:保护数据的新策略
【10月更文挑战第28天】随着云计算的广泛应用,网络安全问题日益突出。本文将深入探讨云计算环境下的网络安全挑战,并提出有效的安全策略和措施。我们将分析云服务中的安全风险,探讨如何通过技术和管理措施来提升信息安全水平,包括加密技术、访问控制、安全审计等。此外,文章还将分享一些实用的代码示例,帮助读者更好地理解和应用这些安全策略。
|
2月前
|
弹性计算 安全 容灾
阿里云DTS踩坑经验分享系列|使用VPC数据通道解决网络冲突问题
阿里云DTS作为数据世界高速传输通道的建造者,每周为您分享一个避坑技巧,助力数据之旅更加快捷、便利、安全。本文介绍如何使用VPC数据通道解决网络冲突问题。
135 0
|
2月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:从漏洞到加密,保护数据的关键步骤
【10月更文挑战第24天】在数字化时代,网络安全和信息安全是维护个人隐私和企业资产的前线防线。本文将探讨网络安全中的常见漏洞、加密技术的重要性以及如何通过提高安全意识来防范潜在的网络威胁。我们将深入理解网络安全的基本概念,学习如何识别和应对安全威胁,并掌握保护信息不被非法访问的策略。无论你是IT专业人士还是日常互联网用户,这篇文章都将为你提供宝贵的知识和技能,帮助你在网络世界中更安全地航行。
|
3月前
|
网络协议 Shell 网络安全
解决两个 Android 模拟器之间无法网络通信的问题
让同一个 PC 上运行的两个 Android 模拟器之间能相互通信,出(qiong)差(ren)的智慧。
41 3
|
3月前
|
存储 安全 网络安全
云计算与网络安全:如何保护您的数据
【10月更文挑战第21天】在这篇文章中,我们将探讨云计算和网络安全的关系。随着云计算的普及,网络安全问题日益突出。我们将介绍云服务的基本概念,以及如何通过网络安全措施来保护您的数据。最后,我们将提供一些代码示例,帮助您更好地理解这些概念。
|
3月前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
86 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
|
3月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
124 0