Android之Http网络编程(三)

在前面两篇博客《Android之Http网络编程(一)》、《Android之Http网络编程(二)》中,简单的介绍了对网页的请求和客户端与服务端的简单的参数交互。那么,这一篇博客就来认识一下Android客户端获取服务端返回的数据。

大家都知道客户端与服务端的交互大体过程如下:

  • Android客户端向服务器发出请求。
  • 服务端接收请求并响应。
  • 服务端返回数据给客户端。

对于Android客户端来说,最重要的也就莫过于获取服务端返回的数据来展示了。

那么,首先我们要知道服务端返回的数据格式是什么?(因为对于服务端返回的数据内容,我们只需要完完整整呈现即可。因此,更重要的就是数据的格式了,因为不同的数据格式获取数据的方式会稍有不同。)最常见的数据格式有:JSON和XML两种。(这两种数据格式的优劣,请参考文章《JSON与XML的区别比较》)对于后者,XML的解析方式有三种:pull解析、sax解析、dom解析。个人认为PULL解析最简单,详情请看另一篇博客《Android XML解析》(这里只有PULL解析,找时间我把另外两种也写上)

这篇博客,我们重点来学习从服务器端返回JSON格式的数据。

JSON格式的数据分为两种,一种是JSON对象,另一种是JSON对象数组。

下面我们分别来实现:

我们先实现获取JSON对象。

我们将下面的JSON字符串复制到一个新建的文本文件(就是记事本打开的那个)中,取名为“testjson”,将后缀改为.json。

{"PubId":"001","PubTitle":"testContent","PubTime":"2014-9-30 12:01:13","PubAuthor":"Admin"}

并将该文件放在Tomcat的文件路径下(我放的路径是E:\编程软件及工具\tomcat\apache-tomcat-7.0.55\webapps\ROOT\mytest),对Tomcat不熟悉的话请看博客《Android中Tomcat的简单配置和使用》。

放在Tomcat文件下后,启动Tomcat服务,在在浏览器中输入访问地址:http://127.0.0.1:8080/mytest/testjson.json

得到如下结果:

这就是通过浏览器查看我们需要获得的JSON格式的数据。

下面我们用代码来实现:

(方便起见,直接在启动Activity时就访问,并输出数据返回结果)

public class MainActivity extends Activity {

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

    private void getData() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpClient client = new DefaultHttpClient();
                HttpGet get = new HttpGet(
                        "http://192.168.1.101:8080/mytest/testjson.json");

                HttpResponse response;
                try {
                    response = client.execute(get);
                    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                        String str = EntityUtils.toString(response.getEntity());
                        //将返回的字符串转换成JSON对象
                        JSONObject json = new JSONObject(str);
                        //获取JSON对象的标签关键字对应的值
                        String id = json.getString("PubId");
                        String title = json.getString("PubTitle");
                        String author = json.getString("PubAuthor");
                        String time = json.getString("PubTime");
                        //输出JSON对象的值
                        System.out.println("id:" + id);
                        System.out.println("title:" + title);
                        System.out.println("author:" + author);
                        System.out.println("time:" + time);
                    }
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }).start();

    }

}

注意:在Android4.0之后不能在主线程中访问网络,记得在清单文件中添加网络访问权限:<uses-permission android:name="android.permission.INTERNET" />

运行程序,结果如下:

这样,我们就获取到了从服务器端返回的JSON格式的数据了,是不是很简单。

接下来我们实现获取JSON对象数组。其实和上面获取JSON对象相似。

将JSON对象数据源换成JSON对象数组,如下:

[{"PubId":"001","PubTitle":"test1","PubTime":"2014-9-30 12:01:13","PubAuthor":"Admin"},{"PubId":"002","PubTitle":"test2","PubTime":"2014-9-31 12:01:13","PubAuthor":"Admin"},{"PubId":"003","PubTitle":"test3","PubTime":"2014-9-31","PubAuthor":"Admin"}]

接下来的操作和获取JSON对象相同。

我们在浏览器中查看:

获取json对象数组的代码实现:

private void getData() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpClient client = new DefaultHttpClient();
                HttpGet get = new HttpGet(
                        "http://192.168.1.101:8080/mytest/testjsonArray.json");

                HttpResponse response;
                try {
                    response = client.execute(get);
                    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                        String str = EntityUtils.toString(response.getEntity());
                        // 将返回的字符串转换成JSON对象数组
                        JSONArray jsonArray = new JSONArray(str);
                        for (int i = 0; i < jsonArray.length(); i++) {                //获取JSON数组中的某一具体JSON对象
                            JSONObject json = jsonArray.getJSONObject(i);
                            // 获取JSON对象的标签关键字对应的值
                            String id = json.getString("PubId");
                            String title = json.getString("PubTitle");
                            String author = json.getString("PubAuthor");
                            String time = json.getString("PubTime");
                            // 输出JSON对象的值
                            System.out.println("id:" + id);
                            System.out.println("title:" + title);
                            System.out.println("author:" + author);
                            System.out.println("time:" + time);
                            System.out
                                    .println("----------------华丽的分割线---------------------");
                        }

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

    }

运行结果如下:

OK,现在获取JSON格式数据的常用操作就完了。

其实,如果是JSON的话,也可以使用第三方包来解析并获取数据,更加方便快捷。比如:Gson包。网上的用法也比较多,有兴趣的童鞋可以看看。

时间: 2024-12-21 20:33:02

Android之Http网络编程(三)的相关文章

Android之Http网络编程(一)

Android应用作为一个客户端程序绝大部分都是需要进行网络请求和访问的,而http通信是一种比较常见并常用的通信方式. 在Android中http网络编程中有两种实现方式,一种是使用HttpURLConnection,另一种就是使用HttpClient. 这两种实现方式的大体过程都是: Android客户端向服务器发出请求. 服务端接收请求并响应. 服务端返回数据给客户端. 在Http通信中有POST和GET两种方式,其不同之处在于GET方式可以获得静态页面,同时可以将请求参数放在URL字符串

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4006009.html 联系方式:[email protected] [系列]Android系列之网络:(持续更新) Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) Android系列之网络(二)----HTTP请求头与响应头 Android

网络编程模型及网络编程三要素

网络模型 计算机网络之间以何种规则进行通信,就是网络模型研究问题. 网络模型一般是指 OSI(Open SystemInterconnection开放系统互连)参考模型 TCP/IP参考模型 网络模型7层概述: 1.物理层:主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流(就是由1.0转化为电流强弱来进行传输,到达目的地后在转化为1.0,也就是我们常说的数模转换与模数转换).这一层的数据叫做比特. 2. 数据链路层:主要将从物理层接收的数

iOS网络编程(三) 异步加载及缓存图片----&gt;SDWebImage

@SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https://github.com/rs/SDWebImage 下载SDWebImage开源包2.将类包拖入工程,再导入MapKit.framework.ImageIO.framework两个框架3.SDWebImage是支持ARC的,在MRC的工程中要注意,可参考MRC工程配置ARC4.注意:SDWebImag

winform网络编程(三)

TcpClient类和TcpListener类 (1)TcpClient的用途: 用于在同步阻止模式下通过网络来链接.发送和接受流数据,在此情况下,必须有侦听此连接的请求,而侦听的任务就交给TcpListener实例或Socket实例 (2)TcpClient的两种方法连接到侦听器 第一种:创建一个TcpClient,并调用3个可用的Connect方法之一 第二种:使用远程主机的主机名和端口号创建TcpClient,此构造函数将自动尝试一个连接 (3)TcpClient的常用属性和方法 Avai

网络编程三素概述

1.1网络编程概述计算机网络 ●是指将地理位置不同的具有独立功能的多 台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 网络编程●在网络通信协议下, 实现网络互连的不同计算机上运行的程序间可以进行数据交换 网络编程三要素 IP地址●要想让网络中的计算 机能够互相通信,必须为每台计算机指定一个标识号, 通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而IP地址就是这个标识号.也就是设备的标识 端口●网

Android开发中网络编程与常见功能优化总结

Android提供的AsyncTask,但事实上AsyncTask的问题更加严重,Thread只有在run函数不结束时才出现这种内存泄露问题,然而AsyncTask内部的实现机制是运用了 ThreadPoolExcutor,该类产生的Thread对象的生命周期是不确定的,是应用程序无法控制的,因此如果AsyncTask作为Activity的内部类,就更容易出现内存泄露的问题. 一般的应用都是从服务器获取数据,然后通过极致的界面风格,将数据清晰,明朗的展现给用户. 那么就可以分为这两块: 1.界面

Linux 网络编程三(socket代码详解)

//网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>//htons()函数头文件 #include <ne

网络编程三---多线程/进程解决并发问题

前文列出的代码给大家展示了一个最简单的网络程序,但正如文章末尾所提的,这个最简单的网络程序最大的缺点是服务端一次只能服务一个客户端,就比如说你去吃饭,饭店只有一个服务员, 而且服务员在客户离开之前只能为一个客户服务,也就是说你只能等待你前面的客户吃好饭离开了,然后你才能进去吃饭,而在你吃饭的时候时候,你后面来的人都得等你吃完饭才能轮到你后面一个人吃饭.这种模式的缺点很明显,因为在你进去点好菜到买单前的这段时间,这个服务员都是空闲的,为什么不让服务员在这个空闲时间让其他客户进来服务员为他点菜呢?在