14.Android学习之网络编程及Internet应用(二)

本文深入探讨Android的网络编程,包括解析JSON格式数据和使用WebView显示网页。介绍了JSON的基本概念和在Android中如何解析,以及WebView的使用,包括浏览网页和开启JavaScript支持的方法。同时,解释了GET和POST请求的区别以及WebView支持JavaScript的重要性。

目录

14.网络编程及Internet应用(二)

2.解析JSON格式数据

2-1.JSON简介

2-2.解析JSON数据

3.使用WebView显示网页

3-1.使用WebView组件浏览网页

3-2.让WebView支持JavaScript

4.难点解答

4-1.GET和POST请求的区别

4-2.WebView支持JavaScript与不支持的区别


14.网络编程及Internet应用(二)

2.解析JSON格式数据

2-1.JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其语法简洁,不仅易于阅读和编写,而且也易于机器的解析和生成。

JSON通常由两种数据结构组成,一种是对象 (“名称/值”形式的映射),另一种是数组(值的有序列表)。ISON 没有变量或其他控制,只用于数据传输。

◆对象

在JSON中,可以使用下面的语法格式来定义对象。

{“属性1”:属性值1,“属性2”:属性值2......“属性n”:属性值n}

◎属性1~属性n:用于指定对象拥有的属性名。

◎属性值1~属性值n:用于指定各属性对应的属性值,其值可以是字符串、数字、布尔值(true/false)、null、 对象和数组。

例如,定义一个保存名人信息的对象,可以使用下面的代码:

{
"name" :"扎克伯格",
"address": "United States New York",
"wellknownsaying" :"当你有使命,它会让你更专注”
}

◆数组

在JSON中,可以使用下面的语法格式来定义对象。

{"数组名":[
对象1,对象2......,对象n
]}

◎数组名:用于指定当前数组名。

◎对象1~对象n:用于指定各数组元素,它的值为合法的JSON对象。例如,定义一个保存名人信息的数组,可以使用下面的代码:

{"famousPerson" :[
{"name":"扎克伯格","address":"美国","wellknownsaying":" 当你有使命,它会让你更专注"},
{"name":"马云","address":"中国","wellknownsaying":"心中无敌者,无敌于天下"}
]}

2-2.解析JSON数据

在Android的官网中提供了解析JSON数据的JSONObject和JSONArray对象。其中,JSONObject用于解析JSON对象;JSONArray用于解析JSON数组。

例:

 MainActivity.java

package com.example.analysisofjsondata;
​
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
​
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
​
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
​
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
​
public class MainActivity extends AppCompatActivity {
    private TextView step,step1,time,time1,heat,heat1,km,km1;
    private Handler handler;
    private String result="";//显示内容
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar=getSupportActionBar();
        actionBar.hide();
​
        step=findViewById(R.id.main_tv1);
        time=findViewById(R.id.main_tv2);
        heat=findViewById(R.id.main_tv3);
        km=findViewById(R.id.main_tv4);
        step1=findViewById(R.id.main_tv5);
        time1=findViewById(R.id.main_tv6);
        heat1=findViewById(R.id.main_tv7);
        km1=findViewById(R.id.main_tv8);
​
        handler=new Handler(){//解析返回的JSON数组并显示
            @Override
            public void handleMessage(@NonNull Message msg) {
                //解析返回的JSON串数据并显示
                TextView[][] textViews={{step,time,heat,km},{step1,time1,heat1,km1}};
                try {
                    JSONArray jsonArray=new JSONArray(result);//获取JSONArray数组
                    for(int i=0;i<jsonArray.length();i++){
                        JSONObject jsonObject=jsonArray.getJSONObject(i);
                        textViews[i][0].setText(jsonObject.getString("step"));
                        textViews[i][1].setText(jsonObject.getString("time"));
                        textViews[i][2].setText(jsonObject.getString("heat"));
                        textViews[i][3].setText(jsonObject.getString("km"));
​
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                super.handleMessage(msg);
            }
        };
​
        //创建一个线程,用于从服务器中获取JSON数组
        new Thread(new Runnable() {
            @Override
            public void run() {
                send();
                Message message=handler.obtainMessage();
                handler.sendMessage(message);
            }
        }).start();
    }
​
    private void send(){
        //要发送请求的服务器地址
        String target="http://192.168.3.19:8080/example/index.json";
        URL url;
        try {
            url=new URL(target);
            HttpURLConnection urlConnection= (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoOutput(true);//从连接中读取数据
            urlConnection.setUseCaches(false);//禁止缓存
            urlConnection.setInstanceFollowRedirects(true);//自动执行HTTP重定向
            //获得读取的内容
            InputStreamReader inputStreamReader=new InputStreamReader(urlConnection.getInputStream());
            //获取输入流对象
            BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
            String inputLine=null;
            while ((inputLine=bufferedReader.readLine())!=null){
                result+=inputLine;
            }
            inputStreamReader.close();
            urlConnection.disconnect();//断开连接
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

AndroidManifest.xml

<!--    访问网络-->
<uses-permission android:name="android.permission.INTERNET"/>

<application>节点下:

android:usesCleartextTraffic="true"

在Tomcat安装路径的webapps文件夹中新建一个文件夹,命名为example,在example文件夹下新建一个.json文件,命名为index.json,在index.json中编写JSON数组:

[{"step":"12,672","time":"1h 58m","heat":"306","km":"8.3"},
{"step":"73,885","time":"11h 41m","heat":"1,771","km":"48.7"}]

运行Tomcat,连接真机运行Android项目。

3.使用WebView显示网页

Android提供了内置的浏览器,该浏览器使用了开源的WebKit引擎。WebKit 不仅能够搜索网址、查看电子邮件,而且能够播放视频节目。在Android中,要使用内置的浏览器,需要通过WebView组件来实现。通过WebView组件可以轻松实现显示网页功能。

3-1.使用WebView组件浏览网页

WebView组件是专门用来浏览网页的,其使用方法与其他组件一样,既可以在XML布局文件中使用<WebView>标记添加,又可以在Java文件中通过new关键字创建。推荐采用<WebView>标记在XML布局文件中添加。在XML布局文件中添加一个WebView组件可以使用下面的代码:

<WebView
         android:id="@+id/webView1"
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>

添加WebView组件后,就可以应用该组件提供的方法来执行浏览器操作了。WebView 组件提供的常用方法如表14.3所示。

表14.3 WebView组件提供的常用方法

方法描述
loadUrl(String url)用于加载指定URL对应的网页
loadData(String data, String mimeType, String encoding)用于将指定的字符串数据加载到浏览器中
loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)用于基于URL加载指定的数据
capturePicture()用于创建当前屏幕的快照
goBack()执行后退操作,相当于浏览器上的后退按钮的功能
goForward()执行前进操作,相当于浏览器上的前进按钮的功能
stopLoading()用于停止加载当前页面
reload()用于刷新当前页面

例:

 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
​
    <WebView
        android:id="@+id/main_wv1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

MainActivity.java

package com.example.webview;
​
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
​
import android.os.Bundle;
import android.view.WindowManager;
import android.webkit.WebView;
​
public class MainActivity extends AppCompatActivity {
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar=getSupportActionBar();
        actionBar.hide();
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        WebView webView=findViewById(R.id.main_wv1);
        webView.loadUrl("https://developer.android.google.cn/reference/");//指定要加载的网页
        webView.getSettings().setUseWideViewPort(true);//设置此属性可按任意比例缩放
        webView.getSettings().setLoadWithOverviewMode(true);//设置加载内容自适应屏幕
        //支持放大和缩小网页功能
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setBuiltInZoomControls(true);
    }
}

AndroidManifest.xml

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

<application>节点下:

android:usesCleartextTraffic="true"

3-2.让WebView支持JavaScript

在默认的情况下,WebView 组件是不支持JavaScript的,但是在运行某些不得不使用JavaScript代码的网站时,需要让WebView支持JavaScript。

实际上,让WebView组件支持JavaScript,只需要以下两个步骤就可以实现。

(1)使用WebView组件的WebSettings对象提供的setJavaScriptEnabled()方法让JavaScript可用。例如,要在一个名称为webview的WebView组件中允许使用JavaScript,可以使用下面的代码:

webview.getSettings().setJavaScriptEnabled(true);//设置JavaScript可用

(2)经过以上设置后,网页中的大部分JavaScript代码均可用。但是,对于通过window.alert()方法弹出的对话框并不可用。要想显示弹出的对话框,需要使用WebView组件的setWebChromeClient()方法来处理JavaScript的对话框,具体代码如下:

webview.setWebChromeClient(new WebChromeClient());

这样设置后,再使用WebView显示带弹出JavaScript 对话框的网页时,网页中弹出的对话框将不会被屏蔽掉。

例:

 MainActivity.java

package com.example.webviewandjavascript;
​
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
​
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
​
public class MainActivity extends AppCompatActivity {
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar=getSupportActionBar();
        actionBar.hide();
​
        WebView webView=findViewById(R.id.main_wv1);
        webView.loadUrl("http://192.168.3.19:8080/example/javascript.jsp");
        webView.getSettings().setJavaScriptEnabled(true);//设置Javascript可用
        webView.setWebChromeClient(new WebChromeClient());//设置处理JavaScript中的对话框
    }
}

AndrioidManifest.xml

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

<application>节点下:

android:usesCleartextTraffic="true"

在Tomcat安装路径的webapps文件夹中新建一个文件夹,命名为example,在example文件夹下新建一个.jsp文件,命名为javascript.jsp,在javascript.jsp中编写代码:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<style type="text/css">
    ul{
        padding-top:30px;
        column-width:30%;}
    li{
        list-style:none;
        float:left;
        width:30%;
        color:#FFFFFF;
        font-size:26px;
font-family:微软雅黑;
}
        textarea{
            border:0px;
width:98%;
            
            }
        body{
padding:0px;
            margin:0 auto;
            width:100%;
background:#e3e3e3;
            
        }
            a{
                text-decoration:none;
                color:#4A8FFF;
                }
div{
margin:0px;
}
</style>
<script language="javascript">
function check(){
    var v=form1.content.value;
    if(v==""){
        alert("请输入说说内容!");
        }else{
            alert("输入的说说内容为:"+v);
            form1.submit();
            }
}
</script>
</head>
​
<body>
        <div style="height:90px;background:#3d4760;">
        <ul>
        <li>取消</li><li style="text-align:center">写说说</li><li style=" text-align:right"><a href="#" onclick="check()" >发表</a></li>
        </ul>
    
      </div>
    <form id="form1" name="form1" method="post" action="" onsubmit="return check()">
      <textarea name="content" id="content"  rows="5" title="写点什么吧"></textarea>
</form>  
<div><img src="bottom2.png" width="100%"  /></div>    
​
</body>
</html>

4.难点解答

4-1.GET和POST请求的区别

HTTP请求通常分为GET和POST请求两种,二者之间的主要区别如表14.4所示。

表14.4 GET与POST的区别

GETPOST
能被缓存不能被缓存
参数保留在测览器历史中参数不保留在浏览器历史中
URL长度受浏览器限制(例如IE浏览器限制最大的长度为2048个字符)URL长度不受限制
数据在URL中对所有人可见数据不会显示在URL中
只允许传递ASCII字符没有限制,也允许二进制数据

4-2.WebView支持JavaScript与不支持的区别

在WebView不支持JavaScript 情况下,运行一个包含JavaScript 代码的网站时将显示如下图1所示的效果,图片无法正常显示,且轮播图静止。在WebView支持JavaScript 情况下,运行一个包含JavaScript 代码的网站时将显示如下图2所示的效果。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值