网络

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()方法里面);
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值