• Android Volley 库通过网络获取 JSON 数据


    本文内容

    • 什么是 Volley 库
    • Volley 能做什么
    • Volley 架构
    • 环境
    • 演示 Volley 库通过网络获取 JSON 数据
    • 参考资料

    Android 关于网络操作一般都会介绍 HttpClient 以及 HttpConnection 这两个包。前者是 Apache 开源库,后者是 Android 自带 API。企业级应用,一般都会选择使用已经封装好的 http 框架。比较流行有 Volley、android-async-httpretrofitokhttpandroidqueryAndroidAsync 等。他们各有特点,不同的框架有不同的效率,如今 Google 推出了官方的针对 Android 平台上的网络通信库 Volley,能使网络通信更快,更简单,更健壮,Volley 在提供了高性能网络通讯功能的同时,对网络图片加载也提供了良好的支持,完全可以满足简单 REST 客户端的需求。另外,但 Volley 扩展性很强,可以根据需要定制你自己的网络请求。

    什么是 Volley 库


    Volley 是 Ficus Kirpatrick 在 Gooogle I/O 2013 发布的一个处理和缓存网络请求的库,能使网络通信更快,更简单,更健壮。Volley 名称的由来 a burst or emission of many things or a large amount at once。在Gooogle I/O 2013 演讲上,其配图是一幅火弓箭。如图 1 所示。

    3

    图 1 Gooogle I/O 2013 Volley

    Volley 管理着处理和缓存网络请求,它节省了开发者的宝贵时间,一次又一次编写相同的网络调用/缓存代码。更少的重复代码,其中一个好处就是减少了 bug,这是所有开发者所期望的。

    所谓“一次又一次编写相同的网络调用/缓存代码”,就是 AsyncTask 以及你编写的通过 Web API 获取响应,并显示出来的逻辑/代码。我们必须在 ProgressBar() 和 onPostExecute() 方法内照顾  ProgressBar/ProgressDialog 。虽然这不是一个艰巨的任务,但却很无聊,甚至感到厌倦,尽管我已经定义了 BaseTask 类来管理ProgressBar/ProgressDialog 的显示/取消,以及更多其它操作。现在,Volley 是替代 AsyncTask 的强大工具。

    Volley 能做什么


    Volley 适合小而快的数据传输,特别是针对以下两种情况:

    • JSON 对象
    • 图片加载

    Volley 优势:

    1. Volley 可以自动安排所有的网络请求。这意味着 Volley 会照顾你 APP 执行的从 Web 获取响应或图片所有的网络请求。
    2. Volley 提供透明的磁盘和内存缓存。
    3. Volley 提供强大的取消请求的 API。这意味着你可以取消一个单独的请求,或是你可以设置取消请求的块(可以为多个)或范围。
    4. Volley 提供强大的自定功能。
    5. Volley 提供调试和追踪工具。

    Volley 架构


    Volley 使用了线程池来作为基础结构,主要分为主线程,cache 线程和 network 线程。主线程和 cache 线程都只有一个,而 NetworkDispatcher 线程可以有多个,这样能解决比并行问题。

    2

    图 2 Volley 架构

    环境


    • Windows 2008 R2 64 位
    • Eclipse ADT V22.6.2,Android 4.4.3
    • 三星 SM-G3508,Android OS 4.1

    演示 Volley 库通过网络获取 JSON 数据


    下载 Demo,将 Volley 库和演示项目导入到 eclipse 里,再将 Volley 库添加到演示项目。程序运行结果如图 3 所示:

    1

    图 3 演示 Volley 库通过网络获取 JSON 数据

    通过 Volley 访问国家气象局提供的 JSON 接口,获得北京的天气状况。

    其中,101010100 代表北京。

    授权 Android 访问网络权限

    修改 AndroidManifest.xml 文件,添加授权 Android 访问网络的权限。

    <uses-permission android:name="android.permission.INTERNET" />

    activity_main.xml 文件只是一个 TextView 控件,一个 ProgreeBar 控件,略,核心代码如下所示:

    package com.example.volleybasicexample;
     
    import org.json.JSONObject;
     
    import com.android.volley.Request;
    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.view.View;
    import android.widget.TextView;
     
    public class MainActivity extends Activity {
        private TextView txtDisplay;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            txtDisplay = (TextView) findViewById(R.id.txtDisplay);
     
            RequestQueue queue = Volley.newRequestQueue(this);
            String url = "http://www.weather.com.cn/data/sk/101010100.html";
            JsonObjectRequest jsObjRequest = new JsonObjectRequest(
                    Request.Method.GET, url, null,
                    new Response.Listener<JSONObject>() {
     
                        @Override
                        public void onResponse(JSONObject response) {
                            // TODO Auto-generated method stub
                            txtDisplay.setText("Response => " + response.toString());
                            findViewById(R.id.progressBar1)
                                    .setVisibility(View.GONE);
                        }
                    }, new Response.ErrorListener() {
     
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            // TODO Auto-generated method stub
     
                        }
                    });
     
            queue.add(jsObjRequest);
     
        }
    }

    有些时候,请求也可以用 StringRequest,如下代码所示,效果是一样的:

            StringRequest stringRequest = new StringRequest(Request.Method.GET,
                    url, new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            // TODO Auto-generated method stub
                            txtDisplay.setText("Response => " + response.toString());
                            findViewById(R.id.progressBar1)
                                    .setVisibility(View.GONE);
                        }
                    }, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            // TODO Auto-generated method stub
     
                        }
                    });

    参考资料


    下载 Demo

  • 相关阅读:
    Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)D. Frequency of String
    edu30F. Forbidden Indices
    QQ登录模拟GUI综合
    Thread与Runnable线程继承与实现
    windowsProgram系统强制隐藏解除代码
    最长公共上升子序列(LCIS问题)
    分层图学习笔记 & [JLOI2011]飞行路线题解
    Luogu P1441 砝码称重
    NOIP 2020 复习计划
    浅析BST二叉搜索树
  • 原文地址:https://www.cnblogs.com/liuning8023/p/3806832.html
Copyright © 2020-2023  润新知