一、使用Http协议访问网络
工作原理:客户端向服务器发出一条HTTP请求,服务器收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理。
1、HttpURLConnection
- 一般来说会先开一个子线程,将这个线程单独包装成一个方法。(主线程即UI线程不进行任何耗时操作,否则会导致程序无法响应,故开启子线程进行耗时操作即网络响应)
- 实例化一个URL对象,封装一个想要访问的资源,用URL的openConnect------ion()方法得到一个HttpURLConnection对象。
- 接着调用HttpURLConnection对象的setRequestMethod(String)方法设置HTTP请求所使用的方法。(常用的方法有"GET"和"POST"。前者表示希望从服务器那里获取数据,而POST则表示希望从服务器那里获取数据。)接下来就可一进行一些自由的定制了,比如设置连接超时,读取超时的毫秒数,(当到了设置的时间还没有反应就是超时)以及服务器希望得到的一些消息头等。HttpURLConnection#setConnection(int),和HttpURLConnection#setReadTimeout(int)。然后就可以用HttpURLCoonnection#getInputStream()得到InputStream()对象。最后要记得用disconnect()方法将这个HTTP连接关闭掉。
- 一般来说得到数据之后是要在UI界面上显示出来的,而Android是不允许在子线程中进行UI操作的,在这里我们一般使用runOnUiThread(new Runnable())将线程切换回主线程,然后再更新UI元素。
- 切记声明权限。
2、OkHttp
(1)GET
- 切记声明权限
- new一个OkHttpClient对象
- 创建一个Request对象用于发起一条HTTP请求。具体格式如:new Request().Builder().url(String)…build()。
- 之后调用OkHttpClient#newCall(Request).execute()得到Response对象,使用Response#body#string()得到返回的具体内容。
response.body().string()本质是输入流的读操作,所以它还是网络请求的一部分,所以这行代码必须放在子线程。
response.body().string()只能调用一次,在第一次时有返回值,第二次再调用时将会返回null。原因是:response.body().string()的本质是输入流的读操作,必须有服务器的输出流的写操作时客户端的读操作才能得到数据。而服务器的写操作只执行一次,所以客户端的读操作也只能执行一次,第二次将返回null
(2)POST
- 切记声明权限
- new一个OkHttpClient对象。
- 创建一个RequestBody对象来存放提交的数据。例如:new FormBody.Builder().add(“键名”,“键值”).build()。
- 创建一个Request对象用于发起一条HTTP请求,具体格式如:new Request().Builder().url(String).post(RequestBody)…build()。
- 之后调用OkHttpClient#newCall(Request).execute()得到Response对象,使用Response#body#string()得到返回的具体内容。
二、解析网络传输数据
1、XML
(1)Pull解析方式
- 用XmlPullParserFactory.newInstance()方法得到XmlPullParserFactory对象,再由XmlPullParserFactory#newPullParser()方法得到XmlPullParser对象。
- 把Response#body()#string()字符串对象放入XmlPullParser#setInput(String)方法中。
- 用XmlPullParser#getEventType()得到int对象,即当前的解析事件。eventType有XmlPullParser.START_TAG,XmlPullParser.END_TAG,XmlPullParser.END_DOCUMENT(解析工作完成)。XmlPullParser#getName()可以得到当前节点名字。
<id>...</id>
(在这里,id就是当前节点名,读到第一个括号时表示START_TAG,读到第二个括号时表示END_TAG)。每次读完记得XmlPullParser#next()更新eventType状态。
(2)SAX解析方式
- 新建一个类继承自DefaultHandler类
- 重写父类方法:startDocument,startElement,characters,endElement,endDocument。
- 用SAXParserFactory.newInstance()方法得到SAXParserFactory对象。再用XMLParserFactory#newSAXParser()#getXMLReader()方法得到XMLReader对象。
- 将DefaultHandler类用XMLReader#setContentHandler()放入其中。
- 最后调用XMLReader#parse(new InputSource(new StringReader(String)))开始解析。
2、json
(1)JSONObject
- JSONArray JsonArray=new JSONArray(String),接着用JSONArray#getString(String)通过键值得出想要的数据。
(2)GSON(ORM)
- 实例化Gson类
- 用Gson#fromJson(String,.class)得到单条Json数据的包装好的实例对象;或者也可以用Gson#fromJson(String,new TypeToken<List<某类>>(){}.getType())得到Json数组的List<某类>对象。
来源:CSDN
作者:worlant
链接:https://blog.csdn.net/worlant/article/details/104461261