Android--网络编程(第一行代码)

北战南征 提交于 2020-02-26 02:48:47

一、使用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<某类>对象。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!