WebView
在应用程序里面加载一些网页
1.使用findViewById()方法获得WebView实例;
2.调用WebView的getSettings()设置浏览器的属性;
3.调用WebView的setWebViewClicent()传入一个WebViewClient实例(当需要从一个网页跳到另一个网页的时候,希望目标网页仍然在当前WebView里面显示,而不是打开系统浏览器)
4.调用WebView的setWebViewClient()方法,将网址传入
使用HTTP协议访问网络
使用HttpURLConnection
发送HTTP一个有两种形式,一种是HttpURLConnection,一种是HttpClient(API数量多,扩展困难)
1.获取到HttpURLConnection实例(new出一个URL对象,传入目标的网络地址,然后调用一下openConnection()方法即可);
URL url = new URL(“http://www.baidu.com”);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
1.设置HTTP请求所使用的方法(GET:希望从服务器那里获取数据;POST:希望提交数据给服务器);
connection.setRequestMethod(“GET”);
1.自由定制(设置连接超时.setConnectTimeout(毫秒),设置读取超时.setReadTimeout(毫秒));
2.调用getInputStream()获取到服务器返回的输入流,然后对其进行读取
3.调用disconnect()将HTTP连接关闭;
ScrollView用滚动的形式来查看屏幕之外的内容
sendRequestWithHttpURLConnection()方法:
1.先开启一个子线程;
2.在子线程里面使用HttpURLConnection发出一条HTTP请求;
3.利用BufferedReader对服务器返回的流进行读取,将结果传入到showResponse()(在showResponse()里面调用了一个runOnUiThread()方法,在这个方法的匿名类参数中进行操作,将线程切换到主线程)
如果HTTP请求的方式改成POST,在获取输入流之前把要提交的数据写出即可,数据以键值对的形式存在,数据与数据之间通过&进行连接;
private open fun sendRequestWithHttpURLConnection() {
// 开启线程来发起网络请求
Thread(object : Runnable {
fun run() {
var connection: HttpURLConnection? = null
var reader: BufferedReader? = null
try {
val url = URL("https://www.baidu.com")
connection = url.openConnection() as HttpURLConnection
connection.setRequestMethod("GET")
connection.setConnectTimeout(8000)
connection.setReadTimeout(8000)
val `in`: InputStream = connection.getInputStream()
// 下面对获取到的输入流进行读取
reader = BufferedReader(InputStreamReader(`in`))
val response: java.lang.StringBuilder = java.lang.StringBuilder()
var line: String?
while (reader.readLine().also({ line = it }) != null) {
response.append(line)
}
showResponse(response.toString())
} catch (e: Exception) {
e.printStackTrace()
} finally {
if (reader != null) {
try {
reader.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
if (connection != null) {
connection.disconnect()
}
}
}
}).start()
}
使用OkHttp
1.创建一个OkHttpClient的实例;
2.如果想发起一条HTTP请求,就需要创建一个Request对象(可通过url()方法来设置目标的网络地址);
3.调用OkHttpClient的newCall()方法来创建一个Call对象,调用它的execute()方法来发送请求并且获取服务器返回的数据
如果发起一条POST请求:需要构造一个RequestBody对象来存放待提交的参数,然后再Request.Builder里调用一下post()方法,将RequestBody对象传入,接下来和GET一样,调用execute()来发送请求并获取服务器返回的数据;
private open fun sendRequestWithOkHttp() {
Thread(object : Runnable {
@Overridepublic
fun run() {
try {
val client = OkHttpClient()
val request: Request = Builder()
.url("http://www.baidu.com")
.build()
val response: Response = client.newCall(request).execute()
val responseData: String = response.body().string()
showResponse(responseData)
} catch (e: Exception) {
e.printStackTrace()
}
}
}).start()
}
解析XML格式数据
Pull解析方式
1.先获取一个XmlPullParseFactory的实例,通过这个实例得到XmlPullParser对象
2.调用XmlPullParser的setInput()方法将服务器返回的XML数据设置进去就可以开始解析了
a.通过getEventType()得到当前的解析事件
b.在一个while循环里面不断地进行解析,如果解析事件不等于XmlPullParser.END_DOCUMENT,则解析工作还没有完成,调用next()方法可以获取下一个解析事件。(在while循环里面,通过getName()方法得到当前节点的名字,用nextText()方法来获取结点内的具体内容)
private open fun parseXMLWithPull(xmlData: String) {
try {
val factory: XmlPullParserFactory = XmlPullParserFactory.newInstance()
val xmlPullParser: XmlPullParser = factory.newPullParser()
xmlPullParser.setInput(StringReader(xmlData))
var eventType: Int = xmlPullParser.getEventType()
var id = ""
var name = ""
var version = ""
while (eventType != XmlPullParser.END_DOCUMENT) {
val nodeName: String = xmlPullParser.getName()
when (eventType) {
XmlPullParser.START_TAG -> {
if ("id" == nodeName) {
id = xmlPullParser.nextText()
} else if ("name" == nodeName) {
name = xmlPullParser.nextText()
} else if ("version" == nodeName) {
version = xmlPullParser.nextText()
}
}
XmlPullParser.END_TAG -> {
if ("app" == nodeName) {
Log.d("MainActivity", "id is $id")
Log.d("MainActivity", "name is $name")
Log.d("MainActivity", "version is $version")
}
}
else -> {
}
}
eventType = xmlPullParser.next()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
SAX解析方式
重写父类的五个方法
startDocument()
在开始XML解析的时候调用(进行数据初始化);
startElement()
在开始解析某个节点的时候调用(记录当前节点名);
characters()
获取节点中内容时时候调用(根据当前节点名判断将节点添加到哪一个StringBuilder中);
endElement()
完成解析某个节点时调用(进行判断是否解析完成)
endDocument()
完成整个XML解析时调用()
如果解析的内容出现空格换行等符号,再调用一下trim()方法,在打印完成之后要将StringBuilder的内容全部清空,不然会影响下一次内容的读取;
parseXMLWithSAX()
1.创建一个SAXParseFactory对象;
2.获取到XMLReader对象;
3.将编写的ContentHandler实例设置到XMLReader里面;
4.调用parse()方法开始解析。
private void parseXMLWithSAX(String xmlData) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
// 将ContentHandler的实例设置到XMLReader中
xmlReader.setContentHandler(handler);
// 开始执行解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (Exception e) {
e.printStackTrace();
}
}
解析JSON数据格式
JSONObject
parseJSONWithJSONObject()
在服务器里面定义的是一个JSON数组;
1.将服务器返回的对象传入到一个JSONArray对象中;
2.循环遍历JSONArray,从里面取出的每一个元素都是一个JSONObject对象;
3.调用getString()方法将这些数据取出。
GSON
可以将一串JSON对象格式的字符串自动映射成一个对象;
1.解析person类
2.解析的是一段JSON数组(借助TypeToken将期望解析成的数据类型传入到fronJson()方法里面);