Android——网络交互,如何调用接口并且json解析json格式和pull解析xml格式
本菜鸟因为之前一直使用的是公司前辈封装好的类(网络接口调用超级方便有木有)完全没有想过有一天我会自己写,然后今天接触的时候一脸懵逼,然后今天花了一天时间终于研究好了;哈哈哈哈哈
二话不说先上代码:
package com.example.administrator.caipiaoproject;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.support.annotation.Nullable; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast;import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import java.util.ArrayList; import java.util.List;/** * Created by Administrator on 2018/3/5. */ public class HomeActivity extends BaseActivity {private RecyclerView recyclerView;private CaiPiaoAdapter caiPiaoAdapter;private TextView number, time;private List<CaiPiaoData> list = new ArrayList<>();private String key = "123";private CaiPiaoViewHolder caiPiaoViewHolder;private Handler handler = new Handler() {@Override public void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.arg1) {case 1:getXml(msg.obj.toString());break;}}};private String open_time;private String how_time;private String code;protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);list = getIntent().getParcelableArrayListExtra(key);setContentView(R.layout.activity_start);if (list == null) {setListData();}recyclerView = findViewById(R.id.recycler);caiPiaoAdapter = new CaiPiaoAdapter(this, list);recyclerView.setAdapter(caiPiaoAdapter);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);recyclerView.setLayoutManager(linearLayoutManager);number = findViewById(R.id.number);time = findViewById(R.id.time_today);getnumber();}@Override public void initTitle() {setMiddleTitele("双色球助手");setRemoveleft();}private void setListData() {list = new ArrayList<>();CaiPiaoData ssq = new CaiPiaoData(R.drawable.ssq, "双色球", 1);list.add(ssq);CaiPiaoData qxc = new CaiPiaoData(R.drawable.qxc2, "七星彩", 2);list.add(qxc);CaiPiaoData dlt = new CaiPiaoData(R.drawable.dlt, "大乐透", 3);list.add(dlt);CaiPiaoData fc3D = new CaiPiaoData(R.drawable.fc3d, "福彩3D", 4);list.add(fc3D);CaiPiaoData gdfc = new CaiPiaoData(R.drawable.gdfc, "广东福彩36选7", 5);list.add(gdfc);CaiPiaoData gdfc2 = new CaiPiaoData(R.drawable.gdfc2, "广东福彩26选5", 6);list.add(gdfc2);CaiPiaoData klsf = new CaiPiaoData(R.drawable.kuaileshifen, "快乐十分", 7);list.add(klsf);CaiPiaoData ssc = new CaiPiaoData(R.drawable.ssc, "时时彩", 8);list.add(ssc);}@Override public void onClickRight() {Intent intent = new Intent(this, ShouCangActivity.class);intent.putParcelableArrayListExtra(key, (ArrayList<? extends Parcelable>) list);startActivity(intent);}private void getnumber() {new Thread(new Runnable() {@Override public void run() {String jos = "";String url = "...";try {URL url_caipiao = new URL(url);HttpURLConnection connection = (HttpURLConnection) url_caipiao.openConnection();connection.setRequestMethod("GET");int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {InputStream inputStream = connection.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream);BufferedReader reader = new BufferedReader(inputStreamReader);String result;while ((result = reader.readLine()) != null)jos += result;}Message message = handler.obtainMessage();message.obj = jos;message.arg1 = 1;handler.sendMessage(message);} catch (MalformedURLException e) {e.printStackTrace();} catch (ProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}).start();}//json解析 /* private void getJson(String s) { try { JSONObject jsonObject = new JSONObject(s); JSONArray jsonArray = jsonObject.optJSONArray("data"); if (jsonArray != null) { for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject1 = jsonArray.optJSONObject(i); //开奖时间 open_time = jsonObject1.optString("opentime"); //开奖期数 how_time = jsonObject1.optString("expect"); code = jsonObject1.optString("opencode"); } number.setText(code); time.setText(open_time); } } catch (JSONException e) { e.printStackTrace(); } }*/ private void getXml(String s) {try {XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();//获取xml抓取解析器工厂实例 XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();//获取xml抓取解析器实例 xmlPullParser.setInput(new StringReader(s));int type = xmlPullParser.getEventType();//获取当前解析事件 while (type != XmlPullParser.END_DOCUMENT) {//0是开始解析节点,1是完成解析节点,2是解析子节点,3是完成子节点解析,4暂且不祥 String nodename = xmlPullParser.getName();//获取节点名字 switch (type) {case XmlPullParser.START_TAG: {if ("row".equals(nodename)) {//判断是否等于子节点名称 open_time = xmlPullParser.getAttributeValue(null, "opentime");//获取标签里的多个值 how_time = xmlPullParser.getAttributeValue(null, "expect");code = xmlPullParser.getAttributeValue(null, "opencode");}}break;default:break;}type = xmlPullParser.next();//每次循环完成必须调用此方法,换成下一个值 }number.setText(code);time.setText(open_time);} catch (XmlPullParserException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }
这里大家可以看到我用了json和pull两种方式进行解析,但是解析之前,我们肯定要写一个接口啊,对吧,然后在网上找了好多接口的写法,我承认真的是层出不穷,但是原谅我一个从来没有写过接口的人,我真的看不懂,于是开始了自己摸索,终于让我成功悟出其中的奥妙
首先,调用接口的方法有很多种,其中比较常用的就是我上面所用的
HttpURLConnection 方法
还有一种呢就是OKHttp了,但是这个方法并不在google官方api中,所以使用的时候需要添加依赖,这里就主要介绍HttpURLConnection方法了
这个方法使用前我们需要一个接口,于是可以看到我定义了
String url = "...";
(为了保险起见我隐藏掉了自己的接口)
然后我们定义一个URL,传入我们的接口
然后我们初始化HttpURLConnection方法,这里调用的是url.getconnection();并且将其强制转换成HttpURLConnection类型
然后重点来了,如果我要要从服务器拿数据
我们在下面一行就写“GET”,如果是我们要发送数据,就写“POST”;
connection.setRequestMethod("GET");
然后我们会看到
getResponseCode
这个方法,这个方法是返回一个服务器返回的数据,如果是200,就代表一切正常,如果是401,那就代表数据异常,还有一种情况就是-1(小编在这里就遇到了,初步原因是因为我没有设置网络权限)
然后我们用输入流读取拿到的数据,警告:重要的事情说三遍
网络请求要使用子线程!!!!网络请求要使用子线程!!!!网络请求要使用子线程!!!!
好了,然后这里我们需要一个handle发送通知,将子线程中的数据取出来,拿到主线程(别问为什么,不然你的接口返回的永远都是没数据),下面就开始了我们今天的重点:
1,如果你拿到的是xml格式的数据,那你有两种解析方法,第一个是pull第二个是sax(pull简单多了,所以这里主要讲pull)
2,如果你拿到的是json类型的数据,你也有两种方式,第一个是json,第二个是gson,至于为何只讲json不讲gson,我想各位百度一下就知道其中利弊
pull解析:
pull解析xml格式数据:
private void getXml(String s) {try {XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();//获取xml抓取解析器工厂实例 XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();//获取xml抓取解析器实例 xmlPullParser.setInput(new StringReader(s));int type = xmlPullParser.getEventType();//获取当前解析事件 while (type != XmlPullParser.END_DOCUMENT) {//0是开始解析节点,1是完成解析节点,2是解析子节点,3是完成子节点解析,4暂且不祥 String nodename = xmlPullParser.getName();//获取节点名字 switch (type) {case XmlPullParser.START_TAG: {if ("row".equals(nodename)) {//判断是否等于子节点名称 open_time = xmlPullParser.getAttributeValue(null, "opentime");//获取标签里的多个值 how_time = xmlPullParser.getAttributeValue(null, "expect");code = xmlPullParser.getAttributeValue(null, "opencode");}}break;default:break;}type = xmlPullParser.next();//每次循环完成必须调用此方法,换成下一个值 }
这里我们先初始化pull解析器工厂,然后将HttpURLConnection中接口拿到的数据使用setInput()进行转换,然后getEventype()获取当前的解析事件,进入循环,这里要介绍五个参数以及它们所对应的值:
1,START_DOCUMENT==0,开始解析文件
2,START_TAG==2,开始解读节点
3,END_TAG==3,解析节点结束
4,END_DOCYMENT==1,解析文件结束
5,TEXT==4,读取字符信息,这里其实和getText()是一样的(不是nextText()!!!不是nextText()!!!!不是nextText()!!!!);
这里首先判断当它没有结束解析文件,然后进行循环,使用getName拿到节点名字,将节点名字进行对比,如果节点名字相同,就是用nextText()获取其中的值,嗯。。。网上大多数文章就介绍道这里了!但是!!我遇到了不一样的事情!!因为你们的xml文件是这样的:
<a>
<b>
“hahahahaha”
</b>
</a>
可是我遇到的是这样的呀:
<a>
<b name="11" password="22"/>
</a>
于是天真的我以为读了节点b就可以拿到里面的数据了,于是这里就要使用到这个方法
xmlPullParser.getAttributeValue
这个方法是拿到子节点中的数据的,比如说上面的例子,当我们判断b是等于子节点名称时,就是用此方法,传入null和“name”就可以拿到数据11了。
json解析:
json解析用的就特别多了,首先我们将HttpURLConnection拿到的json格式数据的字符串拿出来,再使用
JSONObject jsonObject = new JSONObject(s);
就可以将字符串转换成json格式,然后这时候对于新手来说,首先要看的不是忙着解析,而是要看好jsonobject的格式啊!因为一般的json不可能只包含了外面一层,也可能使多层的json,所以我们使用json解析的第一件事情就是先看好json到底是怎样的格式,
比如说:
{“name”:“111”,“password”:“123”}
这就是一个很简单的json格式
解析它,我们只需要使用jsonObject的potString方法,传入字段“name”就可以拿到name的值了
但是还有一种格式
{"name":""json","data":"[{"a":"1","b","2"}]"}
这是包含了jsonArray的jsonobject,所以首先我们得拿到jsonarray,使用jsonobject.optjsonarray("data")就可以拿到上面这个jsonArray的数据了,然后我们将jsonArray进行循环,拿出里面的每一个jsonObject,再使用与上面相同的jsonobject解析方式,就可以拿到全部的数据了!是不是很简单。
Android——网络交互,如何调用接口并且json解析json格式和pull解析xml格式相关推荐
- JSON在Android网络交互中的使用方法
在Android网络交互中使用到JSON传输接收数据. JSONObject为键值对形式的数据,内部使用LinkedHashMap实现.键的类型固定为String,值可取的类型在JSONObject, ...
- mysql查询转json数据库_json格式数据,将数据库中查询的结果转换为json, 然后调用接口的方式返回json(方式一)...
调用接口,无非也就是打开链接 读取流 将结果以流的形式输出 将查询结果以json返回,无非就是将查询到的结果转换成jsonObject ================================ ...
- Android 网络交互之MD5为什么要加盐
MD5为什么要加盐 之前面试的时候,遇到一个面试的哥哥.不停的跟我确认我对网络传输过程中的password进行MD5加密的时候,是否加key了. 当时我很纳闷,因为MD5本身已经是不可逆的了,需要破解 ...
- json格式数据,将数据库中查询的结果转换为json, 然后调用接口的方式返回json(方式一)...
调用接口,无非也就是打开链接 读取流 将结果以流的形式输出 将查询结果以json返回,无非就是将查询到的结果转换成jsonObject ================================ ...
- 【unity】与Android Activity交互并调用JAVA代码传递参数
http://www.xuanyusong.com/archives/667 Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以 ...
- 第五章 网络 之 Android网络知识框架(二)
文章目录 一.Android实现网络请求的主流方法 1.1 HttpClient (1)简介 (2)实现 1.2 HttpURLConnection (1)简介 (2)实现 1.3 对比 二.主流网络 ...
- Android网络篇
http://blog.csdn.net/u011014707/article/details/46584347 针对互联网设计的操作系统,网络编程.多媒体编程.基础框架构成了Android平台应用开 ...
- Android 网络框架之Retrofit源码解析,flutter边框特效
Retrofit的构建使用了建造者模式,这个模式的优点就是可以构造复杂的对象,方便扩展,并且看起来代码比较简洁,美观: 在开始之前,我们先来看一下Retrofit的成员变量: 这里的变量并不是很多,我 ...
- JSONObject 和 GSON 解析 JSON 数据详解(转)
转载:http://www.jianshu.com/p/f99de3ec0636 点此进入:从零快速构建APP系列目录导图 点此进入:UI编程系列目录导图 点此进入:四大组件系列目录导图 点此进入:数 ...
最新文章
- WSGI,uWSGI,uwsgi,Nginx
- android广告平台的介绍
- mfc如何将一个数组中的字节数据用串口发送出去_RS232串口多机通信
- 二叉树特性及详细例子
- 边缘计算的爆发为安防全产业带来了怎样的变化?
- WPF窗体的生命周期
- Metro 风格页面设计
- IO多路复用和epoll反应堆
- 不经历风雨,怎么见彩虹,没有人能随随便便成功
- 图片加密(一)颜色加密
- 线性代数学习笔记——n维向量
- SDNU 1221
- COMP3055 Machine Learning Coursework
- win10安装docker,启动后提示WSL 2 installation is incomplete.
- 模式识别笔记(一)概论、贝叶斯决策(参数估计、非参数估计)
- 键盘按键F1-F12失效的解决办法(ArchLinux)
- WIN32虚拟STM32F7 LCD屏幕(WIN32虚拟单片机)
- 软件性能/压力测试是什么意思?
- 基于TQ2440的busybox根文件系统制作
- matlab散点图+趋势线+评价指标(科研制图)