〇:简介
本页介绍WebView控件,和两个Android网络请求库(OkHttp和Retrofit)
WebView是展示web页面的Android控件。
原生的HttpURLConnection,Square公司的OkHttp和Retrofit。
Android开源:主流网络请求库对比(Android-Async-Http、Volley、OkHttp、Retrofit)
一.WebView
1.WebView基础
WebView是Android提供的用于显示、渲染Web页面的强大控件。
WebView可以单独使用;也可以配合其三个工具类辅助WebView使用。
- WebSettings 类:设置管理WebView
- WebViewClient 类:提供各种事件的回调,重写这些方法实现逻辑。
- WebChromeClient 类:处理JS的对话框、进度、标题等。
2.WebView的demo:显示百度
tip:由于android 9.0后不支持http请求,需在AndroidManifest.xml的application标签中增加 android:usesCleartextTraffic=“true”。
需在AndroidManifest.xml中添加访问网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
步骤1:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.retrofittest.MainActivity">
<!-- 获取网站的标题-->
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""/>
<!--开始加载提示-->
<TextView
android:id="@+id/text_beginLoading"
android:layout_below="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""/>
<!--获取加载进度-->
<TextView
android:layout_below="@+id/text_beginLoading"
android:id="@+id/text_Loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""/>
<!--结束加载提示-->
<TextView
android:layout_below="@+id/text_Loading"
android:id="@+id/text_endLoading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""/>
<!--显示网页区域-->
<WebView
android:id="@+id/webView1"
android:layout_below="@+id/text_endLoading"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="10dp" />
</RelativeLayout>
步骤2:MainActivity.java
package com.example.carson_ho.webview_demo;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
WebView mWebview;
WebSettings mWebSettings;
TextView beginLoading,endLoading,loading,mtitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebview = (WebView) findViewById(R.id.webView1);
beginLoading = (TextView) findViewById(R.id.text_beginLoading);
endLoading = (TextView) findViewById(R.id.text_endLoading);
loading = (TextView) findViewById(R.id.text_Loading);
mtitle = (TextView) findViewById(R.id.title);
mWebSettings = mWebview.getSettings();
mWebview.loadUrl("http://www.baidu.com/");
//设置不用系统浏览器打开,直接显示在当前Webview
mWebview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
//设置WebChromeClient类
mWebview.setWebChromeClient(new WebChromeClient() {
//获取网站标题
@Override
public void onReceivedTitle(WebView view, String title) {
System.out.println("标题在这里");
mtitle.setText(title);
}
//获取加载进度
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress < 100) {
String progress = newProgress + "%";
loading.setText(progress);
} else if (newProgress == 100) {
String progress = newProgress + "%";
loading.setText(progress);
}
}
});
//设置WebViewClient类
mWebview.setWebViewClient(new WebViewClient() {
//设置加载前的函数
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
System.out.println("开始加载了");
beginLoading.setText("开始加载了");
}
//设置结束加载函数
@Override
public void onPageFinished(WebView view, String url) {
endLoading.setText("结束加载了");
}
});
}
//点击返回上一页面而不是退出浏览器
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && mWebview.canGoBack()) {
mWebview.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
//销毁Webview
@Override
protected void onDestroy() {
if (mWebview != null) {
mWebview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
mWebview.clearHistory();
((ViewGroup) mWebview.getParent()).removeView(mWebview);
mWebview.destroy();
mWebview = null;
}
super.onDestroy();
}
}
实现效果:
3.更多API
https://www.jianshu.com/p/3c94ae673e2a
二.OkHttp
使用demo:
1.编辑app/build.gradle添加OkHttp库的依赖
2.调用OkHttp库,实现请求
实现效果:
三.Retrofit
Java、Android的一个HTTP网络请求库。
Retrofit仅是对OkHttp库的封装,网络请求的工作由OkHttp完成。
以调用有道翻译API为例,Retrofit的使用步骤有5步:
- 步骤1:添加Retrofit库的依赖
- 步骤2:创建 接收服务器返回数据 的类Translation
- 步骤3:创建 用于描述网络请求 的接口GetRequest_Interface
- 步骤4:创建 Retrofit 实例、网络请求接口实例、发送网络请求
- 步骤5:处理服务器返回的数据
1.注解类型
注解在 步骤3创建网络请求借口时 配置,用于指定网络请求
2.URL整合
baseUrl:创建Retrofit实例时通过.baseUrl()设置
path:网络请求接口的注解来设置
完整 Url = baseUrl + path
整合规则:
建议第三种方式配置。
3.数据解析器 (Converter)
数据解析:根据收到的响应数据的格式,使用相应的数据解析器,对响应数据解析得到实体类。
- Retrofit支持多种数据解析方式
- 使用时需要在Gradle添加依赖
数据解析器 | Gradle依赖 |
---|---|
Gson | com.squareup.retrofit2:converter-gson:2.0.2 |
Jackson | com.squareup.retrofit2:converter-jackson:2.0.2 |
Simple XML | com.squareup.retrofit2:converter-simplexml:2.0.2 |
Protobuf | com.squareup.retrofit2:converter-protobuf:2.0.2 |
Moshi | com.squareup.retrofit2:converter-moshi:2.0.2 |
Wire | com.squareup.retrofit2:converter-wire:2.0.2 |
Scalars | com.squareup.retrofit2:converter-scalars:2.0.2 |
4.Retrofit的demo:翻译
以调用有道翻译API为例,将"hello world"译为"你好世界"
步骤1:添加Retrofit库的依赖
- 在 Gradle加入Retrofit库的依赖
build.gradle
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.0.2'// Retrofit库
implementation 'com.squareup.retrofit2:converter-gson:2.0.2' //Gson Converter
}
- 添加网络权限
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
步骤2:创建 接收服务器返回数据 的类Translation
有道API返回的数据示例:
- 根据 API 返回的json,创建 接收服务器返回数据 的类Translation:
Translation.java
public class Translation {
private int status;
private content content;
private static class content {
private String from;
private String to;
private String vendor;
private String out;
private int errNo;
}
//定义 输出返回数据 的方法
public void show() {
System.out.println(status);
System.out.println(content.from);
System.out.println(content.to);
System.out.println(content.vendor);
System.out.println(content.out);
System.out.println(content.errNo);
}
}
步骤3:创建 用于描述网络请求 的接口GetRequest_Interface
访问API的URL格式
// URL模板
http://fy.iciba.com/ajax.php
// URL实例
http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world
// 参数说明:
// a:固定值 fy
// f:原文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto
// t:译文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto
// w:查询内容
采用 注解 描述网络请求参数。
GetRequest_Interface.java
public interface GetRequest_Interface {
@GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world")
Call<Translation> getCall();
// 注解里传入 网络请求 的部分URL地址
// Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里
// 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略
// getCall()是接受网络请求数据的方法
}
步骤4:创建 Retrofit 实例、网络请求接口实例、发送网络请求
步骤4、步骤5都在GetRequest.java中
步骤5:处理服务器返回的数据
public class GetRequest extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
request();// 使用Retrofit封装的方法
}
public void request() {
//创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url
.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
.build();
//创建 网络请求接口 的实例
GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
//对 发送请求 进行封装
Call<Translation> call = request.getCall();
//发送网络请求(异步)
call.enqueue(new Callback<Translation>() {
//请求成功时回调
@Override
public void onResponse(Call<Translation> call, Response<Translation> response) {
// 异步处理返回的数据结果
response.body().show();
}
//请求失败时回调
@Override
public void onFailure(Call<Translation> call, Throwable throwable) {
System.out.println("连接失败");
}
});
}
}
记得去AndroidManifest.xml中修改主Activity
运行结果: