Android网络技术

---恢复内容开始---

 

一 WebView控件

1.权限声明

因为需要互联网,所以声明权限

<uses-permission android:name="android.permission.INTERNET"/>

2.布局文件

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent">
 4 
 5     <WebView
 6         android:id="@+id/web_view"
 7         android:layout_width="match_parent"
 8         android:layout_height="match_parent" />
 9 
10 </LinearLayout>

布局文件很简单,只是使用了一个webview控件。

3.MainActivity文件

 1 public class MainActivity extends AppCompatActivity {
 2 
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7 
 8         WebView webView = (WebView)findViewById(R.id.web_view);
 9         //使用webView的getSetting方法进行设置,而这里设置其支持JavaScript脚本
10         webView.getSettings().setJavaScriptEnabled(true);
11         /*调用了setWebChromeClient()方法,并传入了一个实例。
12         * 作用是当网页跳转时,使用的还是webview,不会打开系统浏览器*/
13         webView.setWebChromeClient(new WebChromeClient());
14         webView.loadUrl("http://www.baidu.com");
15     }
16 }

如上,先对webview进行注册。然后进行相关设置。最后导入目标网址Uri。

 

二 使用HTTPURLConnection发送Http请求

1.步骤

  1.权限声明,   

<uses-permission android:name="android.permission.INTERNET"/>

  2.获取HttpURLConnection实例,new一个URL对象并传入目标网址,然后用openConnection()方法

URL url = new URL("https://www.baidu.com");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();

  3.获取实例后,设置Http请求使用方法,是get还是post。

connection.setRequestMethod("GET");

  4.设置其他属性,如连接超时,读取超时的毫秒数。

connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);

  5.调用getInputStream()方法获得到服务器返回的输入流。之后就是对输入流进行读取。

InputStream in = connection.getInputStream();

2.实例代码

 1 public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 2 
 3     TextView responseText;
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9         Button sendRequest = (Button)findViewById(R.id.send_request);
10         responseText = (TextView)findViewById(R.id.response_text);
11         sendRequest.setOnClickListener(this);
12     }
13 
14     @Override
15     public void onClick(View view) {
16         if(view.getId()==R.id.send_request){
17             sendRequestWithHttpURLConnection();
18         }
19     }
20 
21     private void sendRequestWithHttpURLConnection() {
22         /*开启线程来发起网络请求*/
23         new Thread(new Runnable() {
24             @Override
25             public void run() {
26                 HttpURLConnection connection = null;
27                 BufferedReader reader = null;  //缓冲字符输入流
28                 try{
29                     URL url = new URL("https://www.baidu.com");
30                     connection = (HttpURLConnection)url.openConnection();
31                     connection.setRequestMethod("GET");
32                     connection.setConnectTimeout(8000);
33                     connection.setReadTimeout(8000);
34                     InputStream in = connection.getInputStream();  //获得了服务器返回的输入流
35                     /*下面对获取到的输入流进行读取*/
36                     reader = new BufferedReader(new InputStreamReader(in));
37                     StringBuilder response = new StringBuilder();
38                     String line;
39                     while ((line=reader.readLine())!=null){
40                         response.append(line);
41                     }
42                     showResponse(response.toString());
43                 }catch (Exception e){
44                     e.printStackTrace();
45                 }finally {
46                     if(reader!=null){
47                         try{
48                             reader.close();
49                         } catch (IOException e) {
50                             e.printStackTrace();
51                         }
52                     }
53                     if(connection!=null){
54                         connection.disconnect();
55                     }
56                 }
57             }
58         }).start();
59     }
60 
61     private void showResponse(final String response){
62         runOnUiThread(new Runnable() {
63             @Override
64             public void run() {
65                 //在这里进行ui操作,将结果显示到页面上。
66                 responseText.setText(response);
67             }
68         });
69     }
70 }

 

三 使用OkHttp

1.添加依赖

因为okhttp不是原生库,需要添加依赖,在app/build.gradle文件中的 dependencies 闭包中添加依赖:

compile 'com.squareup.okhttp3:okhttp:3.4.1'

2.步骤

  1.创建一个OkHttpClient实例

OkHttpClient client = new OkHttpClient();

  2.创建一个Request对象,和之前创建通知时类似,使用builder构造器,将要加的属性加在后面,最后加上build()。默认是get请求

1 Request request = new Request.Builder()
2              .url("http://www.baidu.com")
3              .build();

  3.使用OKhttpclient的newCall()来创造一个call对象,并调用他的执行方法execute()来发送请求并获得服务器返回的数据。其中Response(响应)对象就是服务器返回的数据

Response response = client.newCall(request).execute();

  4.得到返回的具体内容

String responseData = response.body().string();

  5.如果是post请求,则需要先构造出RequestBody对象来存储要提交的数据。

1 RequestBody requestBody = new FormBody.Builder()
2          .add("username","admin")
3          .add("password","123123")
4          .build();

  然后在第二步中的Request.builder中调用一下post()方法,将RequestBody对象传入:

1 Request request = new Request.Builder()
2          .url("http://www.baidu.com")
3          .post(requestBody)
4          .build();

3.实例代码:

 1 public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 2 
 3     TextView responseText;
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9         Button sendRequest = (Button) findViewById(R.id.send_request);
10         responseText = (TextView) findViewById(R.id.response_text);
11         sendRequest.setOnClickListener(this);
12     }
13 
14     @Override
15     public void onClick(View view) {
16         if (view.getId() == R.id.send_request) {
17             sendRequestWithOkHttp();
18         }
19     }
20 
21     private void sendRequestWithOkHttp() {
22         /*开启线程来发起网络请求*/
23         new Thread(new Runnable() {
24             @Override
25             public void run() {
26                 try {
27                     OkHttpClient client = new OkHttpClient();
28                     Request request = new Request.Builder()
29                             .url("http://www.baidu.com")
30                             .build();
31                     Response response = client.newCall(request).execute();
32                     String responseData = response.body().string();
33                     showResponse(responseData);
34                 } catch (Exception e) {
35                     e.printStackTrace();
36                 }
37             }
38         }).start();
39     }
40 
41     private void showResponse(final String response) {
42         runOnUiThread(new Runnable() {
43             @Override
44             public void run() {
45                 //在这里进行ui操作,将结果显示到页面上。
46                 responseText.setText(response);
47             }
48         });
49     }
50 }

 

四 解析XML格式数据

1.搭建服务器以及创建xml文件

Apache官方下载地址:官方下载地址

下载后点击http.exe即可打开服务器。然后在Apache\htdoce目录下创建xml文件。名为get_data.xml:

 1 <apps>
 2     <app>
 3         <id>1</id>
 4         <name>Google Maps</name>
 5         <version>1.0</version>
 6     </app>
 7     <app>
 8         <id>2</id>
 9         <name>chorme</name>
10         <version>2.1</version>
11     </app><app>
12         <id>31</id>
13         <name>Google Play</name>
14         <version>2.3</version>
15     </app>
16 </apps>

在浏览器中访问 127.0.0.1/get_data.xml就可以进行访问到了:

2.Pull 解析方法

  1.在request的builde()中设置url为本机地址: .url(“http://10.0.2.2/get_data.xml”).build(); 。并且调用parseXMLWithPull()方法来解析服务器返回的数据。

  2.在parseXMLWithPull()中,首先先要获取一个XmlPullParserFactory的实例,并通过实例获取XmlPullParser对象。

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();

  3.调用XmlPullParser的setInput方法,将服务器返回的xml数据设置进去开始解析。

xmlPullParser.setInput(new StringReader(xmlData));

  4.解析过程:首先通过getEventType()可以得到当前的解析事件,在while循环中进行解析,如果解析事件没结束,在循环结束时,调用next()获取下一个解析事件。

1 int eventType = xmlPullParser.getEventType();
2 while (eventType != XmlPullParser.END_DOCUMENT) {
3     ······
4     eventType = xmlPullParser.next();
5 }

  5.在while中,使用getNAME()得到当前节点名字,如果等于id,name,version等关键字,则使用newtText()来获取到节点中的内容。每解析完一个app节点后打印。

 1             String nodeName = xmlPullParser.getName();
 2                 switch (eventType) {
 3                     //开始解析某个节点
 4                     case XmlPullParser.START_TAG: {
 5                         if ("id".equals(nodeName)) {
 6                             id = xmlPullParser.nextText();
 7                         } else if ("name".equals(nodeName)) {
 8                             name = xmlPullParser.nextText();
 9                         } else if ("version".equals(nodeName)) {
10                             version = xmlPullParser.nextText();
11                         }
12                         break;
13                     }
14                     //完成解析某个节点
15                     case XmlPullParser.END_TAG: {
16                         if ("app".equals(nodeName)) {
17                             Log.d("MainAcitvity", "id is " + id);
18                             Log.d("MainAcitvity", "name is " + name);
19                             Log.d("MainAcitvity", "version is " + version);
20                         }
21                         break;
22                     }
23                     default:
24                         break;
25                 }        

 

整体代码如下:

 1     private void sendRequestWithOkHttp() {
 2         /*开启线程来发起网络请求*/
 3         new Thread(new Runnable() {
 4             @Override
 5             public void run() {
 6                 try {
 7                     Log.d("MainActivity", "进入线程");
 8                     OkHttpClient client = new OkHttpClient();
 9                     Request request = new Request.Builder()
10                             .url("http://10.0.2.2/get_data.xml")
11                             .build();
12                     Response response = client.newCall(request).execute();
13                     String responseData = response.body().string();
14                     parseXMLWithPull(responseData);
15                 } catch (Exception e) {
16                     e.printStackTrace();
17                 }
18             }
19         }).start();
20     }
21 
22     private void parseXMLWithPull(String xmlData) {
23         try {
24             XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
25             XmlPullParser xmlPullParser = factory.newPullParser();
26             xmlPullParser.setInput(new StringReader(xmlData));
27             String id = "";
28             String name = "";
29             String version = "";
30             int eventType = xmlPullParser.getEventType();
31             while (eventType != XmlPullParser.END_DOCUMENT) {
32                 String nodeName = xmlPullParser.getName();
33                 switch (eventType) {
34                     //开始解析某个节点
35                     case XmlPullParser.START_TAG: {
36                         if ("id".equals(nodeName)) {
37                             id = xmlPullParser.nextText();
38                         } else if ("name".equals(nodeName)) {
39                             name = xmlPullParser.nextText();
40                         } else if ("version".equals(nodeName)) {
41                             version = xmlPullParser.nextText();
42                         }
43                         break;
44                     }
45                     //完成解析某个节点
46                     case XmlPullParser.END_TAG: {
47                         if ("app".equals(nodeName)) {
48                             Log.d("MainAcitvity", "id is " + id);
49                             Log.d("MainAcitvity", "name is " + name);
50                             Log.d("MainAcitvity", "version is " + version);
51                         }
52                         break;
53                     }
54                     default:
55                         break;
56                 }
57                 eventType = xmlPullParser.next();
58             }
59         } catch (Exception e) {
60             e.printStackTrace();
61         }
62     }

 

五 解析JSON格式数据

1.创建json格式数据

同上在htdocs目录中创建一个get_data.json如下:

[{"id":"5","version":"5.1","name":"the one"},
{"id":"6","version":"6.1","name":"the two"},
{"id":"7","version":"7.1","name":"the three"}]

在浏览器上访问本地数据如下:

 

2.使用JSONObject解析数据

因为服务器中定义的是一个json数组,将传入数据先放在一个JSONArray中,然后遍历这个JSONArray,取出每一个JSONObject对象,并使用getString()取出每一个数据进行打印。

 1     private void parseJSONWithJSONObject(String jsonData) {
 2         try{
 3             /*服务器定义的是一个json数据,遍历jsonArray数组中每一个对象都是一个JSONObject对象*/
 4             JSONArray jsonArray = new JSONArray(jsonData);
 5             for(int i= 0;i<jsonArray.length();i++){
 6                 JSONObject jsonObject = jsonArray.getJSONObject(i);
 7                 String id = jsonObject.getString("id");
 8                 String name = jsonObject.getString("name");
 9                 String version = jsonObject.getString("version");
10                 Log.d("MainActivity","id is "+id);
11                 Log.d("MainActivity","name is "+id);
12                 Log.d("MainActivity","version is "+version);
13             }
14         }catch (Exception e){
15             e.printStackTrace();
16         }
17     }

整体代码简单易懂。

 

3.使用GSON方法解析

GSON库可以将一段json格式字符串自动映射为一个对象。

  1.添加GSON库的依赖

  在app/build.gradle的dependdependncies中添加依赖

compile 'com.google.code.gson:gson:2.7'

  2.如果一段json格式数据如下: {“name”:“tom”,“age”:“29”}  那么可以定义一个person类,创建name和age两个字段,然后简单的调用如下代码就可以将json自动解析为一个person对象。

Gson gson = new gson();
Person person = gson.fromJson(jsonData,Person.class);

  3.如果是一段json数组格式数据。需要借助TypeToken将期望解析成的数据类型传入到jsonFrom方法中:如下

List<Person> people = gson.fromJson(jsonData,new TypeToken<List<Person>>(){}.getType());

 

实例如下:

新建一个App类:

 1 public class App {
 2     private String id;
 3     private String name;
 4     private String version;
 5 
 6     public String getId() {
 7         return id;
 8     }
 9 
10     public String getName() {
11         return name;
12     }
13 
14     public String getVersion() {
15         return version;
16     }
17 
18     public void setId(String id) {
19         this.id = id;
20     }
21 
22     public void setName(String name) {
23         this.name = name;
24     }
25 
26     public void setVersion(String version) {
27         this.version = version;
28     }
29 }

修改MainActivity中解析部分的代码:

1     private void parseJSONWithGSON(String jsonData) {
2         Gson gson = new Gson();
3         List<App> appList = gson.fromJson(jsonData,new TypeToken<List<App>>(){}.getType());
4         for(App app:appList){
5             Log.d("MainActivity","id is "+app.getId());
6             Log.d("MainActivity","name is "+app.getName());
7             Log.d("MainActivity","version is "+app.getVersion());
8         }
9     }

 

转载于:https://www.cnblogs.com/Mask-D/p/9549935.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值