Google官方网络框架-Volley的使用解析Json以及加载网络图片方法

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: <div class="markdown_views"><h1 id="google官方网络框架-volley的使用解析json以及加载网络图片方法">Google官方网络框架-Volley的使用解析Json以及加载网络图片方法</h1><hr><pre><code> Volley是什么? Google I/O 大会上,Google 推出 Volley的一个网络框架

Google官方网络框架-Volley的使用解析Json以及加载网络图片方法


 Volley是什么?
 Google I/O 大会上,Google 推出 Volley的一个网络框架
 Volley适合什么场景?
 Volley适合网络通信频繁操作,并能同时实现多个网络通信。 

下载地址:http://download.csdn.net/detail/qq_26787115/9358787

1.Volley的使用解析Json

我们不罗嗦,直接开讲:

我们的需求很简单,就是做一个归属地查询的小软件,使用Volley解析一段地址获取Json并且解析Json显示出来,很简单的需求吧,也很基础,不过却很直观!
先来看看效果图吧!

号码是乱打的

步骤

1.申请地址已经key
2.把Volley的jar文件导入工程
3.解析地址获取到json
4.解析json填入

1.申请的Key:22a6ba14995ce26dd0002216be51dabb
2.接口地址(聚合数据申请的):http://apis.juhe.cn/mobile/get?phone=13429667914&key=您申请的KEY
3.将Volley导入工程
4.开工了

注意一定要先添加权限:<uses-permission android:name="android.permission.INTERNET"/>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/tab1_rl"
        android:layout_width="match_parent"
        android:layout_height="51dp"
        android:background="#34c083" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="51dp"
            android:layout_centerHorizontal="true"
            android:background="@null"
            android:gravity="center"
            android:text="归属地查询"
            android:textColor="@android:color/white"
            android:textSize="20dp" />
    </RelativeLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="10dp"
        android:text="请输入你的手机号码查询归属地信息" />

    <EditText
        android:id="@+id/et"
        android:layout_width="fill_parent"
        android:layout_height="45dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:background="@drawable/ed_bg"
        android:gravity="center"
        android:hint="请输入正确的电话号码" />

    <Button
        android:id="@+id/btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:background="#34c083"
        android:text="查询"
        android:textColor="@android:color/white" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:layout_marginTop="10dp"
        android:background="#aeaea9" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:gravity="center_vertical"
        android:text="归属地:" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#aeaea9" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:gravity="center_vertical"
        android:text="区号:" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#aeaea9" />

    <TextView
        android:id="@+id/tv3"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:gravity="center_vertical"
        android:text="运营商:" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#aeaea9" />

    <TextView
        android:id="@+id/tv4"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:gravity="center_vertical"
        android:text="用户类型:" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#aeaea9" />

</LinearLayout>
这里没什么可说的,和预览界面的布局是一样的
EditText:输入电话号码 id: android:id="@+id/et"
Button:点击查询  android:id="@+id/btn"
TextView:归属地,区号,运营商,用户类型   android:id="@+id/tv1234"

MainActivity.java

这里首先说一下步骤了:
1.初始化这几个控件
2.给Button添加点击事件
//这里就是判断用户输入的方法,输入不为空的话就执行 Volley_Get();方法
btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                myPhone = et.getText().toString();
                if (et == null) {
                    Toast.makeText(MainActivity.this, "号码不能为空",
                            Toast.LENGTH_LONG).show();
                } else {
                    Volley_Get();
                }
            }
        });
3.Volley_Get方法是解析接口获取Json字符的,并且使用的是GET方法,还有POST方法我就不赘述了,抛砖引玉,不懂自行Google
    private void Volley_Get() {
        //接口地址 myphone为我们输入的电话号码  Key:22a6ba14995ce26dd0002216be51dabb
        String url = "http://apis.juhe.cn/mobile/get?phone=" + myPhone
                + "&key=22a6ba14995ce26dd0002216be51dabb";
        RequestQueue queue = Volley.newRequestQueue(this);
        StringRequest request = new StringRequest(Method.GET, url,
                new Listener<String>() {
                    // 成功
                    @Override
                    public void onResponse(String json) {
                        Volley_Json(json);
                        Toast.makeText(MainActivity.this, "成功:"+json, 1).show();
                    }
                }, new Response.ErrorListener() {
                    // 失败
                    @Override
                    public void onErrorResponse(VolleyError errorLog) {
                        Toast.makeText(MainActivity.this, "失败:"+errorLog.toString(),
                                Toast.LENGTH_LONG).show();
                    }
                });
        queue.add(request);

    }

4.Volley_Json();

当我们解析这个接口成功的话就会得到一个json的字符串了,具体的样子是这个样子的
    {
    "resultcode": "200",
    "reason": "Return Successd!",
    "result": {
        "province": "江西",
        "city": "吉安",
        "areacode": "0796",
        "zip": "343000",
        "company": "中国联通",
        "card": "江西联通GSM卡"
    },
    "error_code": 0
}
我们现在新建一个方法Volley_Json()并且定义一个String的参数,如下:
private void Volley_Json(String json) {
        //result为200说明成功
        try {
            JSONObject jsonObject = new JSONObject(json);
            JSONObject object = jsonObject.getJSONObject("result");
            tv1.setText("归属地:" + object.getString("province") + "-"
                    + object.getString("city"));
            tv2.setText("区号:" + object.getString("areacode"));
            tv3.setText("运营商:" + object.getString("company"));
            tv4.setText("用户类型:" + object.getString("card"));

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

这样子就可以解析出json中的字符串并且显示出来达到归属地的查询效果了,下面是MainActivity的完整代码以及Demo下载链接:

package com.lgl.queryaddress;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request.Method;
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;

public class MainActivity extends Activity {

    private TextView tv1, tv2, tv3, tv4;
    private EditText et;
    private Button btn;
    private String myPhone;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        getActionBar().hide();
        setContentView(R.layout.activity_main);

        initView();
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                myPhone = et.getText().toString();
                if (et == null) {
                    Toast.makeText(MainActivity.this, "号码不能为空",
                            Toast.LENGTH_LONG).show();
                } else {
                    Volley_Get();
                }
            }
        });
    }

    private void initView() {
        et = (EditText) findViewById(R.id.et);
        btn = (Button) findViewById(R.id.btn);
        tv1 = (TextView) findViewById(R.id.tv1);
        tv2 = (TextView) findViewById(R.id.tv2);
        tv3 = (TextView) findViewById(R.id.tv3);
        tv4 = (TextView) findViewById(R.id.tv4);
    }

    private void Volley_Get() {
        String url = "http://apis.juhe.cn/mobile/get?phone=" + myPhone
                + "&key=22a6ba14995ce26dd0002216be51dabb";
        RequestQueue queue = Volley.newRequestQueue(this);
        StringRequest request = new StringRequest(Method.GET, url,
                new Listener<String>() {
                    // 成功
                    @Override
                    public void onResponse(String json) {
                        Volley_Json(json);
                        Toast.makeText(MainActivity.this, "成功:"+json, 1).show();
                    }
                }, new Response.ErrorListener() {
                    // 失败
                    @Override
                    public void onErrorResponse(VolleyError errorLog) {
                        Toast.makeText(MainActivity.this, "失败:"+errorLog.toString(),
                                Toast.LENGTH_LONG).show();
                    }
                });
        queue.add(request);

    }

    private void Volley_Json(String json) {
        //result为200说明成功
        try {
            JSONObject jsonObject = new JSONObject(json);
            JSONObject object = jsonObject.getJSONObject("result");
            tv1.setText("归属地:" + object.getString("province") + "-"
                    + object.getString("city"));
            tv2.setText("区号:" + object.getString("areacode"));
            tv3.setText("运营商:" + object.getString("company"));
            tv4.setText("用户类型:" + object.getString("card"));

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9360953

2.Volley加载网络图片

 相对于请求json字符串,解析网络的图片倒是步骤少了,玩法也多起来,我们还是从简单的做起,还是以一个例子来,先看下效果图!

刘桂林

就是一个Button和一个ImageView,点击Button加载图片信息

步骤
1.获取图片的链接
2.添加权限
3.加载网络图片

layout_main.xml

<LinearLayout 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:orientation="vertical" 
    android:background="#FDFDFD">

    <RelativeLayout
        android:id="@+id/tab1_rl"
        android:layout_width="match_parent"
        android:layout_height="51dp"
        android:background="#34c083" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="51dp"
            android:layout_centerHorizontal="true"
            android:background="@null"
            android:gravity="center"
            android:text="归属地查询"
            android:textColor="@android:color/white"
            android:textSize="20dp" />
    </RelativeLayout>

    <Button
        android:id="@+id/btn"
        android:textSize="20sp"
        android:textColor="@android:color/white"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="30dp"
        android:background="#34c083"
        android:text="加载图片" />

    <ImageView
        android:layout_marginTop="50dp"
        android:layout_gravity="center_horizontal"
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

</LinearLayout>
一个Button  android:id="@+id/btn"
一个imageview  android:id="@+id/iv"

初始化这两个控件之后就直接解析了,代码不多,看MainActivity的完整代码

package com.lglvolleyiv;

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.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private Button btn;
    private ImageView iv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActionBar().hide();
        setContentView(R.layout.activity_main);

        iv = (ImageView) findViewById(R.id.iv);
        btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Volley_Iv();
            }
        });

    }

    // 加载图片
    protected void Volley_Iv() {
        //图片是百度的logo,直接浏览器右键获取图片地址即可
        String url ="http://ss.bdimg.com/static/superman/img/logo/bd_logo1_31bdc765.png";
        //请求
        RequestQueue queue = Volley.newRequestQueue(this);
         /**
          * ImageRequest的构造函数接收六个参数,
          * 第一个参数就是图片的URL地址。
          * 第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。
          * 第三第四个参数分别用于指定允许图片最大的宽度和高度,设置不正确会对图片进行压缩。
          * 第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用。
          * 第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。
          */
         ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {

            @Override
            public void onResponse(Bitmap response) {
                //成功就直接设置获取到的bitmap图片
                iv.setImageBitmap(response);
            }
        }, 0, 0, Config.RGB_565, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                // 失败了
            }
        });
        //最后将这个ImageRequest对象添加到RequestQueue里就可以
        queue.add(imageRequest);
    }
}

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9362615

这个项目的完整思路应该是查询到了运营商显示相应的logo,不过这部分还没做,完善了整个项目的构架就上架了,有兴趣的可以去试试:


百度:http://shouji.baidu.com/software/item?docid=8424313&from=as

91:http://apk.91.com/Soft/Android/com.lgl.queryaddress-1.html

安卓:http://apk.hiapk.com/appinfo/com.lgl.queryaddress/1


上线项目的源码:http://download.csdn.net/detail/qq_26787115/9379019

后续还会继续更新一些,这只是抛砖引玉写一些基础而已,高手勿喷!!!

目录
相关文章
|
8天前
|
人工智能 自然语言处理 搜索推荐
ViDoRAG:开源多模态文档检索框架,多智能体推理+图文理解精准解析文档
ViDoRAG 是阿里巴巴通义实验室联合中国科学技术大学和上海交通大学推出的视觉文档检索增强生成框架,基于多智能体协作和动态迭代推理,显著提升复杂视觉文档的检索和生成效率。
73 8
ViDoRAG:开源多模态文档检索框架,多智能体推理+图文理解精准解析文档
|
9天前
|
机器学习/深度学习 数据可视化 PyTorch
深入解析图神经网络注意力机制:数学原理与可视化实现
本文深入解析了图神经网络(GNNs)中自注意力机制的内部运作原理,通过可视化和数学推导揭示其工作机制。文章采用“位置-转移图”概念框架,并使用NumPy实现代码示例,逐步拆解自注意力层的计算过程。文中详细展示了从节点特征矩阵、邻接矩阵到生成注意力权重的具体步骤,并通过四个类(GAL1至GAL4)模拟了整个计算流程。最终,结合实际PyTorch Geometric库中的代码,对比分析了核心逻辑,为理解GNN自注意力机制提供了清晰的学习路径。
157 7
深入解析图神经网络注意力机制:数学原理与可视化实现
|
2月前
|
监控 安全 网络安全
深入解析PDCERF:网络安全应急响应的六阶段方法
PDCERF是网络安全应急响应的六阶段方法,涵盖准备、检测、抑制、根除、恢复和跟进。本文详细解析各阶段目标与操作步骤,并附图例,助读者理解与应用,提升组织应对安全事件的能力。
421 89
|
8天前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
JSON数据解析实战:从嵌套结构到结构化表格
|
3天前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
31 12
|
9天前
|
缓存 边缘计算 安全
阿里云CDN:全球加速网络的实践创新与价值解析
在数字化浪潮下,用户体验成为企业竞争力的核心。阿里云CDN凭借技术创新与全球化布局,提供高效稳定的加速解决方案。其三层优化体系(智能调度、缓存策略、安全防护)确保低延迟和高命中率,覆盖2800+全球节点,支持电商、教育、游戏等行业,帮助企业节省带宽成本,提升加载速度和安全性。未来,阿里云CDN将继续引领内容分发的行业标准。
52 7
|
15天前
|
云安全 人工智能 安全
阿里云网络安全体系解析:如何构建数字时代的"安全盾牌"
在数字经济时代,阿里云作为亚太地区最大的云服务提供商,构建了行业领先的网络安全体系。本文解析其网络安全架构的三大核心维度:基础架构安全、核心技术防护和安全管理体系。通过技术创新与体系化防御,阿里云为企业数字化转型提供坚实的安全屏障,确保数据安全与业务连续性。案例显示,某金融客户借助阿里云成功拦截3200万次攻击,降低运维成本40%,响应时间缩短至8分钟。未来,阿里云将继续推进自适应安全架构,助力企业提升核心竞争力。
|
2月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
2月前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
60 11
|
2月前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
251 12

热门文章

最新文章

推荐镜像

更多