Android 网络相关

〇:简介

本页介绍WebView控件,和两个Android网络请求库(OkHttp和Retrofit)

WebView是展示web页面的Android控件。

原生的HttpURLConnection,Square公司的OkHttpRetrofit

在这里插入图片描述

在这里插入图片描述

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

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依赖
Gsoncom.squareup.retrofit2:converter-gson:2.0.2
Jacksoncom.squareup.retrofit2:converter-jackson:2.0.2
Simple XMLcom.squareup.retrofit2:converter-simplexml:2.0.2
Protobufcom.squareup.retrofit2:converter-protobuf:2.0.2
Moshicom.squareup.retrofit2:converter-moshi:2.0.2
Wirecom.squareup.retrofit2:converter-wire:2.0.2
Scalarscom.squareup.retrofit2:converter-scalars:2.0.2
4.Retrofit的demo:翻译

以调用有道翻译API为例,将"hello world"译为"你好世界"

步骤1:添加Retrofit库的依赖

  1. 在 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
  }
  1. 添加网络权限
    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

运行结果:
在这里插入图片描述

5.参考链接

Android Retrofit 2.0 的详细 使用攻略(含实例讲解)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值