WebView
可以在应用程序中嵌入一个浏览器
-
例子
-
定义一个控件
<WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent" />
-
编写MainActivity中的逻辑
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView webView = (WebView) findViewById(R.id.web_view); // 使用getSettings()方法去设置一些浏览器的属性 webView.getSettings().setJavaScriptEnabled(true); // 调用setWebViewClient()方法,传入了一个WebViewClient实例, // 这样当需要从一个网页跳转到另一个网页的时候,目标网页仍然在WebView中显示,不用打开系统浏览器 webView.setWebViewClient(new WebViewClient()); webView.loadUrl("http://www.baidu.com"); } }
-
在AndroidManifest.xml中声明权限
<uses-permission android:name="android.permission.INTERNET"/>
-
HTTP相关
HttpURLConnection
Android上本来有两种发送HTTP请求的方式,在Android6.0中,HttpClient被移除了,就剩下HttpURLConnection
-
例子
URL url = new URL("https://www.baidu.com"); // 获取HttpURLConnection的实例 HttpURLConnection connection = (HttpURLConnection)url.openConnection(); // 设置HTTP请求使用的方法(GET和SET) connection.seetRequestMethod("GET"); // 设置连接超时 connection.setTimeout(6000); // 设置读取超时 connection.setReadIimeout(4000); // 获取服务器返回的输入流 InputStream is = connection.getInputStream(); // 操作完之后关闭连接 connection.disconnect();
OkHttp
Square公司开发的第三方网络通信库
-
添加依赖(app/build.gradle)
implementation 'com.google.android.exoplayer:extension-okhttp:2.17.1'
-
例子
-
发起GET请求
// 创建一个实例 OkHttpClient client = new OkHttpClient(); // 创建一个Request对象 Request request = new Request.Builder() .url("https://www.baidu.com") .build(); // 调用newCall()方法创建一个Call对象,然后调用其中的execute()方法发送请求并获取返回数据 Response response = client.newCall(request).execute(); // 获取返回的数据 String responseData = response.body().string();
-
发起POST请求
// 创建一个实例 OkHttpClient client = new OkHttpClient(); // 构造一个RequestBody对象来存放要提交的参数 RequestBody requestBody = new FormBody.Builder() .add("username","admin") .add("password","123456") .build(); // 调用post()方法, Request request = new Request.Builder() .url("https://www.baidu.com") .post(requestBody) .build(); // 调用newCall()方法创建一个Call对象,然后调用其中的execute()方法发送请求并获取返回数据 Response response = client.newCall(request).execute(); // 获取返回的数据 String responseData = response.body().string();
-
解析XML格式数据
-
假设有如下待解析的xml数据
<apps> <app> <id>1</id> <name>Tom</name> <age>17</age> </app> <app> <id>2</id> <name>Jack</name> <age>18</age> </app> <app> <id>3</id> <name>Helen</name> <age>19</age> </app> </apps>
Pull解析XML格式
-
例子
private void sendRequestWithOkHttp() { new Thread(new Runnable() { @Override public void run() { try { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://127.0.0.1/data.xml") .build(); Response response = client.newCall(request).execute(); String responseData = response.body().string(); parseXMLWithPull(responseData); } catch (Exception e) { e.printStackTrace(); } } }).start(); } private void parseXMLWithPull(String xmlData) { try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser = factory.newPullParser(); xmlPullParser.setInput(new StringReader(xmlData)); int eventType = xmlPullParser.getEventType(); String id = ""; String name = ""; String age = ""; while (eventType != XmlPullParser.END_DOCUMENT) { String nodeName = xmlPullParser.getName(); switch (eventType) { // 解析某个节点 case XmlPullParser.START_TAG: { if ("id".equals(nodeName)) { id = xmlPullParser.nextText(); } else if ("name".equals(nodeName)) { name = xmlPullParser.nextText(); } else if ("age".equals(nodeName)) { age = xmlPullParser.nextText(); } break; } // 解析完成 case XmlPullParser.END_TAG: { if ("app".equals(nodeName)) { Log.d("MainActivity", "id is " + id); Log.d("MainActivity", "name is " + name); Log.d("MainActivity", "age is " + age); } break; } default: break; } eventType = xmlPullParser.next(); } } catch (Exception e) { e.printStackTrace(); } }
- 在parseXMLWithPull()方法中
- 首先获取一个XmlPullParserFactory的实例,然后拿到XmlPullParser对象
- 调用setInput()方法将服务器返回的XML数据设置进去
- 通过getEventType()方法拿到当前要解析的内容,然后通过while循环进行解析
- while循环中的判断条件是只要待解析的内容不是XmlPullParse.END_DOCUMENT,就继续调用next()方法解析
SAX解析XML格式
-
自定义一个类继承DefalutHandler,然后重写父类中的方法
public class MyHandler extends DefaultHandler { private String nodeName; private StringBuilder id; private StringBuilder name; private StringBuilder age; @Override public void startDocument() throws SAXException { // 初始化StringBuilder对象 id = new StringBuilder(); name = new StringBuilder(); age = new StringBuilder(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { nodeName = localName; // 获取当前节点的名字 } @Override public void characters(char[] ch, int start, int length) throws SAXException { if ("id".equals(nodeName)) { id.append(ch, start, length); } else if ("name".equals(nodeName)) { name.append(ch, start, length); } else if ("age".equals(nodeName)) { age.append(ch, start, length); } } @Override public void endElement(String uir, String localName, String qName) throws SAXException { if ("app".equals(localName)) { // trim()方法用来删除字符串头尾的空白符(包括空格,制表符,换行符) Log.d("MyHandler", "id is" + id.toString().trim()); // 最后清空StringBuilder id.setLength(0); name.setLength(0); age.setLength(0); } } @Override public void endDocument() throws SAXException { super.endDocument(); } }
- startDocument():在开始解析XML的时候调用
- startElement():在开始解析某个节点的时候调用
- characters():在获取节点中内容的时候调用
- endElement():在完成解析某个节点的时候调用
- endDocument():在完成整个XML解析的时候调用
-
然后定义方法
private void parseXMLWithSAX(String xmlData){ try { // 创建一个SAXParserFactory对象 SAXParserFactory factory = SAXParserFactory.newInstance(); // 获取XMLReader对象 XMLReader xmlReader = factory.newSAXParser().getXMLReader(); MyHandler handler = new MyHandler(); // 将上面编写的MyHandler的实例设置到XMLReader中 xmlReader.setContentHandler(handler); // 调用xmlReader中的parse()方法开始解析 xmlReader.parse(new InputSource(new StringReader(xmlData))); }catch (Exception e){ e.printStackTrace(); } } }
解析JSON格式数据
-
假设有如下待解析的JSON格式数据
[{"id":5,"gender":"male","name":"Owen"}, {"id":6,"gender":"female","name":"Mia"}, {"id":7,"gender":"male","name":"Marcus"}]
JSONObject解析JSON数据
JSONObject是官方提供的
-
例子
private void parseJSONWithJSONObject(String jsonData){ try { // 创建一个JSONArray对象,将数据传进去 JSONArray jsonArray = new JSONArray(jsonData); // 循环变量jsonArray,里面的每一个元素都是一个JSONObject对象 // 调用getString()方法将其中的数据取出并打印出来 for (int i=0;i<jsonArray.length();i++){ JSONObject jsonObject = jsonArray.getJSONObject(i); String id = jsonObject.getString("id"); String name = jsonObject.getString("name"); String gender = jsonObject.getString("gender"); Log.d("MainActivity","name is "+name); } } catch (Exception e){ e.printStackTrace(); } } }
使用GSON解析JSON数据
谷歌提供的GSON开源库
-
添加依赖(app/build.grade)
implementation 'com.google.code.gson:gson:2.8.6'
-
GSON可以将一段JSON格式的字符串自动映射成一个对象
-
假设有一段JSON数据如下
{"name":"Tom","age":15}
-
调用GSON解析这段数据
Gson gson = new Gson(); Person person = gson.fromJson(jsonData,Person.class);
-
解析一段JSON数组
List<Person> people = gson.fromJson(jsonData,new TypeToken<list<Person>>(){}.getType())
-
-
例子
-
首先新建一个类
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.util.List; package com.example.networktest; public class App { private String id; private String name; private String gender; public String getId() { return id; } public String getName() { return name; } public String getGender() { return gender; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void setGender(String gender) { this.gender = gender; } }
-
定义解析方法
private void parseJSONWithGSON(String jsonData){ Gson gson = new Gson(); List<App> appList = gson.fromJson(jsonData,new TypeToken<List<App>>(){}.getType()); for (App app:appList){ Log.d("MainActivity","id is "+app.getId()); } }
- 这里需要借助TypeToken<T>将需要解析成的数据类型传入到fromJson()方法中
-