Android网络技术

WebView的使用:

这里我们不需要设置过多的属性:

WebView是用来显示网页的

  1. 显示网页内容:开发人员可以使用 WebView 来加载和显示网页,使用户可以在应用内浏览网站内容,而无需离开应用。

  2. 内嵌第三方内容:WebView 也用于内嵌第三方服务和内容,如社交媒体插件、在线支付页面、广告等。这允许应用程序提供更多功能,而不必用户离开应用。

  3. 用户登录和授权:一些应用程序使用 WebView 来显示身份验证页面,例如,当用户需要登录到他们的帐户或授权第三方应用程序访问他们的数据时。

  4. 显示本地 HTML 和资源:WebView 还可以用于显示本地的 HTML 内容和应用内资源,这对于创建离线应用或具有动态内容的应用程序非常有用。

 具体我们先获得控件webView的实例,然后调用webView的getSettings()方法可以设置一些浏览器的属性,只是调用

setJavaScriptEnabled(true)

让webView支持JavaScript脚本,下来比较重要的是我们调用webView的setWebViewClient方法,并传入了一个webViewClient的实例,这段代码的作用是,将网页显示在客户端,而不是跳转,打开浏览器。最后一步就是加载网页的网址。

package com.example.notification;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity7 extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main7);
        webView = findViewById(R.id.wv);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebViewClient(new WebViewClient());
        webView.loadUrl("https://www.baidu.com");
    }
}

记得在Manifest文件中,打开网络的权限。

为什么需要打开javaScript?

整个得到这个页面的过程,内部很复杂,可以概括为:通过http请求,服务器返回网页html,解析返回的数据,此处的

setJavaScriptEnabled(true)

就是用javaScript解析返回的html数据。通过启用 JavaScript,你的 WebView 可以像一个标准的网页浏览器一样执行 JavaScript 代码,从而呈现出服务器传输的 HTML 内容的完整功能。如果不启用 JavaScript,那么 WebView 将不会执行网页中的 JavaScript 代码,导致网页的功能受到限制,甚至无法正常加载。

使用http协议访问网络:

这里我们感受以下,webView这个类得到网页的整个过程,包括向服务器申请数据服务器返回数据解析数据,整个过程。我们会直接看到数据是怎么样的。

具体思路:

Android上发送http请求一般有两种方式:httpUrlConnection和HttpClinet,但是HttpClient过于复杂,已经在安卓6.0的时候,官方删除了,因此,我们使用HttpUrlConnection,进行操作,第一步首先需要获取到HTTP U人类Connection实例,一般只需要new一个URL出来,并调用openConnection方法返回UrlConnection,并强制转向下转型为HttpUrlConnection,得到实例之后,我们可以设置以下Http请求所使用的方法,setRequestMethod,有两个参数可以选择:

“GET”和“POST”,GET是从服务器获取数据,而POST则是希望提交数据给服务器,系欸小拿来就可以进行一些自由定义了,之后再调用getInputStream()获取服务器返回的输入流,就可以读取数据了,在安卓中,跟网络有关的操作,需要放在子线程里面操作,因为如果网络有延迟,则会对用户造成很不好的体验,此处使用了多线程,并且在使用runOnUiThread中更新ui。

package com.example.notification;

import androidx.appcompat.app.AppCompatActivity;

import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity8 extends AppCompatActivity implements View.OnClickListener {

    private Button btn_send;
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main8);
        btn_send = findViewById(R.id.btn_send);
        btn_send.setOnClickListener(this);
        tv = findViewById(R.id.tv_data);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_send) {
            //使用子线程实现网络服务
            new Thread() {

                private BufferedReader bufferedReader;
                private HttpURLConnection httpURLConnection;
                private URL url;

                @Override
                public void run() {
                    super.run();
                    try {
                        url = new URL("https://www.baidu.com");
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    }
                    try {
                        httpURLConnection = (HttpURLConnection) url.openConnection();
                        httpURLConnection.setRequestMethod("GET");
                        httpURLConnection.setConnectTimeout(8000);
                        httpURLConnection.setReadTimeout(8000);
                        InputStream inputStream = httpURLConnection.getInputStream();
                        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                        StringBuilder str = new StringBuilder();
                        String line;
                        while ((line = bufferedReader.readLine()) != null) {
                            str.append(line);
                        }
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                tv.setText(str);
                            }
                        });
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            if (bufferedReader != null) {
                                bufferedReader.close();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        if (httpURLConnection != null) {
                            httpURLConnection.disconnect();
                        }
                    }
                }
            }.start();

        }
    }
}

如何向服务器提交数据呢?

首先之前有提到,将setRequestMethod方法改成POST,然后获取输出流,记住,输出的数据必须是按键值对的方法传递的,并且用&连接:

DataOutputStream out  = new DataOutputStream(httpUrlconnection.getOutputStream());

out.write("name=123&password=123456");

 使用okhttp:

接收数据:

由于是在客户端申请数据,所以我们使用类名就叫做:OkHttpClient,

创建一个OkHttpClient对象,创建一个Request请求,使用url方法,设置网址,最后调用build方法建立。

Request request = new Request.Builder().url("https://ww.baidu.com").build();

如果不设置url,那么这个request就只是是一个空的request对象。一个空对象

之后调用OkHttpClient的new call()方法创建一个Call对象,并调用excute方法,开始执行,发送给服务器请求吗,并接受数据

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

这个Response对象就是返回的数据了,我们可这样来获取信息

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

最后在TextView上显示

package com.example.notification;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

import java.io.IOException;

import okhttp3.OkHttp;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity9 extends AppCompatActivity {

    private Response response;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main9);
        //使用okhttp
        Button btn = findViewById(R.id.btn_send);
        TextView tv = findViewById(R.id.tv);
        OkHttpClient okHttp = new OkHttpClient();
        //创建一个request请求
        Request request = new Request.Builder().url("https://ww.baidu.com").build();
        try {
            response = okHttp.newCall(request).execute();
            String data = response.body().string();
            tv.setText(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

发送数据:

发送一条POST请求

在建立request的基础上,创建一个RequestBody类的实例,

 RequestBody body = new FormBody.Builder().add("username", "admin").add("password", "123").build();

数据按键值对的方式存储。

然后再request中使用post方法加上,然后通过call对象执行返回一个Response对象,从中获取数据。

package com.example.notification;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

import java.io.IOException;

import okhttp3.FormBody;
import okhttp3.OkHttp;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class MainActivity9 extends AppCompatActivity {

    private Response response;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main9);
        //使用okhttp
        Button btn = findViewById(R.id.btn_send);
        TextView tv = findViewById(R.id.tv);
        OkHttpClient okHttp = new OkHttpClient();
        //创建一个request请求
        RequestBody body = new FormBody.Builder().add("username", "admin").add("password", "123").build();
        Request request = new Request.Builder().url("https://ww.baidu.com").post(body).build();
        try {
            response = okHttp.newCall(request).execute();
            String data = response.body().string();
            tv.setText(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解析XML格式数据:

pull解析方式:

sax解析方式:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值