当前位置:首页 > CN2资讯 > 正文内容

android 请求服务器 app请求服务器数据

1天前CN2资讯


1. 实例化URL对象

首先第一步实例化一个URL对象,传入参数为请求的数据的网址。

URL url = new URL("http://www.imooc.com/api/teacher?type=3&cid=1");

2. 获取HttpURLConnection对象

调用URL对象的openConnection方法将返回一个URLConnection对象,而URLConnection类为HttpURLConnection类的父类,可强制转换为我们需要的HttpURLConnection对象。

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

3. 设置请求连接属性

可通过第二步获取的HttpURLConnection对象设置连接的属性,例如setRequestMethod设置连接类型“GET”或“POST”、setReadTimeout设置读取超时时限等等。

conn.setRequestMethod("GET"); conn.setReadTimeout(6000);

4. 获取响应码

响应码用于确认是否连接结果,若返回值为HttpURLConnection.HTTP_OK(200)则连接成功。

conn.getResponesCode();

5. 读取并解析输入流

通过HttpURLConnection对象可以获取到一个输入流,选取适当的方式将输入流的内容读取到本地,再进行解析。

可以直接用JSONObject进行解析,也可以用第三方框架,推荐使用gson。

if (conn.getResponesCode() == 200) { InputStream in = conn.getInputStream(); byte[] b = new byte[1024 * 512]; int len = 0; //建立缓存流,保存所读取的字节数组 ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((len = in.read(b)) > -1) { baos.write(b, 0, len); } String msg = baos.toString(); //解析数据 JSONObject obj = new JSONObject(msg); JSONObject data = obj.getJSONObject("data"); String title = data.getString("title"); String author = data.getString("author"); String content = data.getString("content"); }

gson解析数据简单介绍:

(1)gson解析普通json对象:gson的使用依赖于JSONObject,通过JSONObject对象的getString方法,以字符串形式获取相应数据,而后将其解析为指定类。

String data = obj.getString("data");//obj为JSONObject对象 Gson gson = new Gson(); Essay e = gson.fromJson(data, Essay.class);//第一个参数为json对象形式的字符串,第二个参数为自定义的类,需要将json对象解析成什么类型,就传入相应的类

(2)gson解析数组形式数据:

解析数组形式的数据,步骤与普通json对象基本一致,不同的是,这里fromJson方法的第一个参数为满足json数组形式的字符串,第二个参数则为一个Type对象,而Type对象需通过TypeToken对象的getType方法获取。

获取Type对象:new TypeToken<ArrayList>(){}.getType(),TypeToken的泛型决定数据解析为什么类型,数组形式的数据一般解析为List,而List的泛型为每一个数组元素对应的类,要注意类的属性名需要与json数组中每一项里面的key值保持一致

String data = new JSONObject(result).getString("data");//result为未解析的json字符串 Gson gson = new Gson(); Type listType = new TypeToken<ArrayList<Essay>>(){}.getType(); ArrayList<Essay> e = gson.fromJson(data, listType);

6. 将数据传递回主线程

由于网络操作不能在主线程中进行,而子线程又不允许对UI进行操作,因此需要将解析的数据传递回主线程。

通过使用Handler和Message进行线程之间的通信,代码请看下方完整例子。

7. 完整案例

布局xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:///apk/res/android" xmlns:tools="http:///tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.studying.network.DetailActivity"> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:gravity="center" android:textSize="24sp" /> <TextView android:id="@+id/author" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:gravity="right" android:paddingRight="10dp" android:textSize="20sp" /> <TextView android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="8dp" android:layout_marginTop="15dp" android:layout_weight="1" android:lineSpacingMultiplier="1.5" android:textSize="20sp" /> </LinearLayout>

Activity:

public class DetailActivity extends Activity { private TextView titleView, authorView, contentView; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Essay essay = (Essay) msg.obj; titleView.setText(essay.getTitle()); authorView.setText(essay.getAuthor()); contentView.setText(essay.getContent()); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); initView(); initData(); } public void initView() { titleView = (TextView) findViewById(.title); authorView = (TextView) findViewById(.author); contentView = (TextView) findViewById(.content); } public void initData() { //网络操作不能在主线程中进行 new Thread(){ @Override public void run() { try { URL url = new URL("http://www.imooc.com/api/teacher?type=3&cid=1"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setReadTimeout(6000); //获取响应码的同时会连接网络 if (conn.getResponseCode() == 200) { InputStream in = conn.getInputStream(); byte[] b = new byte[512 * 1024]; int len = 0; //将输入流的内容转存到字节数组流中 ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((len = in.read(b)) > -1){ baos.write(b, 0, len); } String result = baos.toString(); //解析数据 JSONObject obj = new JSONObject(result); JSONObject data = obj.getJSONObject("data"); String title = data.getString("title"); String author = data.getString("author"); String content = data.getString("content"); //通过Message将数据传递回主线程 Message message = handler.obtainMessage(); Essay essay = new Essay(title, author, content);//Essay为自定义类,用于传递多个值 message.obj = essay; handler.sendMessage(message);//调用这个方法,会触发主线程中Handler对象里的handleMessage方法 conn.disconnect(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } } }.start(); } }

Essay:

public class Essay { private String title, author, content; public Essay(String title, String author, String content) { this.title = title; this.author = author; this.content = content; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/31961.html

    分享给朋友:

    “android 请求服务器 app请求服务器数据” 的相关文章

    ChicagoVPS 测评:性能、价格与客户服务的全面分析

    在开始谈论ChicagoVPS之前,我想分享一些关于它的背景故事。ChicagoVPS成立于2010年,源于对高效和可靠的虚拟专用服务器(VPS)的需求。作为一家快速崛起的公司,它在短短几年内就积累了相当可观的用户基础。它在美国中西部的沃土上发展壮大,吸引了不少希望获得优质服务的用户。公司的愿景是提...

    阿里云香港轻量服务器:高性价比云计算解决方案

    阿里云香港轻量服务器是我在寻找云计算解决方案时发现的一个非常实用的选择。它不仅具备高性价比,还有灵活的配置和便捷的管理体验,适合各种用户需求。让我带你深入了解一下这个产品的特点和优势。 首先,香港轻量服务器的价格设置比较合理。我看到它提供多个配置供用户选择,无论是新手还是有经验的开发者都能在这里找到...

    Lightlayer在菲律宾的应用与优势:智能光电解决方案

    光电技术的迅速发展让我们有机会迎接许多新概念和新技术,其中Lightlayer便是一个值得关注的例子。在我第一次听到“Lightlayer”这个词时,它似乎蕴含了科技的无限可能。Lightlayer简单来说是一个光电解决方案,能够通过创新的方式来管理和优化光源。它不仅在设计上追求完美,更在功能上实现...

    选择和管理海外服务器的最佳策略与优势

    在如今这个信息高度发达的时代,海外服务器逐渐成为许多企业的不二选择。简单来说,海外服务器是指那些位于中国境外的数据处理设备。这些服务器致力于为全球用户提供高效的服务,不论是数据存储、网站托管还是其他在线服务。通过使用海外服务器,企业能够接触到更广阔的市场以及可定制的解决方案,以满足特定需求。 选择海...

    在Ubuntu上使用宝塔面板进行服务器管理的全方位指南

    宝塔面板简介 作为一款在服务器管理领域取得广泛认可的工具,宝塔面板在Linux系统中尤为突出,特别是针对Ubuntu用户而言。通过提供直观的操作界面,宝塔有效地简化了复杂的Linux服务器管理过程。对于我这样的用户来说,宝塔无疑是一个不可多得的助手,轻松应对日常维护和配置工作。 宝塔面板不仅仅是一款...

    选择Cogent VPS的理由:稳定性、灵活性与优质支持

    谈到虚拟专用服务器(VPS),我想很多人可能会对这个概念产生好奇。VPS是一种将物理服务器分割成多个虚拟服务器的技术。每个VPS都有独立的操作系统和资源,这与共享主机有很大不同。共享主机的用户资源是共用的,而VPS用户则有更多的控制权和灵活性。这种架构使得VPS成为中小企业和开发者的理想选择。 接下...