HTTP协议简介

什么是HTTP协议?

• HTTP(Hyper Text Transfer Protocol)协议即超文本传输协议,它规定了浏览器和万维网服务器之间互相通信的规则。
• HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

日常生活中,大多数人遇到了问题都会使用手机进行百度搜索。在浏
览器的地址栏中输入百度的网址点击搜索,此时就会进入百度主页。
这个访问百度的过程就是通过HTTP协议完成的。

从图中可以看出,使用手机客户端访问百度时,会发送一个HTTP请求。
当服务器端接收到这个请求后,会做出响应并将百度页面返回给客户端
浏览器。这个请求和响应的过程实际上就是HTTP通信的过程。

Volley网络框架的使用

什么是Volley?

Volley网络框架简介

  • 2013年Google I/O大会上推出的一个新的Android网络通信框架,能使网络通信更快,更
    简单,更健壮。
    • Json,图像等的异步下载
    • 网络请求的排序(scheduling)
    • 网络请求的优先级处理
    • 缓存
    • 多级别取消请求
    • 和Activity生命周期联动(Activity结束时同时取消所有请求)

Volley主页 https://android.googlesource.com/platform/frameworks/volley
Github地址 https://github.com/mcxiaoke/android-volley

Android 中使用Volley

  • 在Android工程中添加Volley

    • compile ‘com.mcxiaoke.volley:library:1.0.19’
    • implementation ‘com.mcxiaoke.volley:library:1.0.19’
  • 加网络访问权限:

    • android.permission.INTERNET
  • StringRequest,JsonObjectRequest,JsonArrayRequest,ImageRequest

    • 1.创建一个请求队列RequestQueue
    • 2.创建Request对象
    • 3.将请求对象添加到请求队列中

案例1:狗狗图片APP(一)

UI界面设计

如图:

image-20210203161125322

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:padding="20dp"
tools:context=".MainActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ImageView
android:id="@+id/iv_img"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_launcher_foreground" />

<EditText
android:id="@+id/edt_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="请粘贴链接地址" />

<Button
android:id="@+id/btn_commit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="提交" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

加载网络图片

  • 添加Volley框架

    1
    implementation 'com.mcxiaoke.volley:library:1.0.19'
  • 添加网络访问权限

    1
    <uses-permission android:name="android.permission.INTERNET"/>
  • 使用ImageRequest加载网络图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void loadImage(View view){
//1.创建请求队列
requestQueue = Volley.newRequestQueue(this);

String url = editText.getText().toString();
//2.创建请求
ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);

}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this,"网络错误",Toast.LENGTH_SHORT).show();
}
});
//3.将请求加入队列
requestQueue.add(request);
}

案例2:狗狗图片APP(二)

  • 进行图片缓存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void loadCacheImage(View view){
//创建网络请求队列
requestQueue = Volley.newRequestQueue(MainActivity.this);

//获取网络图片路径url
String url = editText.getText().toString();

//创建请求
ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());//带缓存
//加载不到图片,加载失败,采用默认图
ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher);

imageLoader.get(url,imageListener);
}
  • BitmapCache类(见素材)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package com.example.imagenet;

    import android.graphics.Bitmap;
    import android.util.LruCache;

    import com.android.volley.toolbox.ImageLoader;

    /**
    * 图片缓存
    */
    public class BitmapCache implements ImageLoader.ImageCache{

    private LruCache<String,Bitmap> mCache;

    public BitmapCache() {
    int maxSize = 10* 1024 *1024;//10m
    mCache = new LruCache<String,Bitmap>(maxSize){
    @Override
    protected int sizeOf(String key, Bitmap bitmap) {
    return bitmap.getRowBytes() * bitmap.getHeight();
    }
    };
    }

    @Override
    public Bitmap getBitmap(String url) {
    return mCache.get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
    mCache.put(url,bitmap);
    }
    }

Json解析框架Gson的使用

JSON格式数据介绍

JSON:独立于语言和平台,比 XML 更小、更快,更易解析。JSON数据
已经成为了互联网中大多数数据的传递方式。

Android 之 JSON格式数据解析

  • Android平台自带了JSON解析的相关API,可以将文件、输入流中的数据转化为JSON对象,然后从对象中获取JSON保存的数据内容。

  • Android的JSON解析部分都在包org.json下,主要有以下几个类:

    • JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元。
    • JSONStringer:json文本构建类 ,根可以帮助快速和便捷的创建JSON text。
    • JSONArray:它代表一组有序的数值。
    • JSONTokener:json解析类。
1
2
3
4
5
JSONObject jsonObject = new JSONObject(result);  
int resultCode = jsonObject.getInt("resultcode");
JSONArray resultJsonArray = jsonObject.getJSONArray("result");
JSONObject resultJsonObject = resultJsonArray.getJSONObject(0);
String city = resultJsonObject.getString("city") ;

案例3:豆瓣电影APP(一)

Volley及INTERNET权限

  • 添加Volley框架

  • 添加网络访问权限

  • 添加图片缓存BitmapCache类(见素材)

  • 改造电影实体Movie类,添加电影图片url:imgUrl

加载豆瓣电影列表

Gson 框架简介

  • Gson 是google解析Json的一个开源框架,同类的框架fastJson,JackJson等等
  • 基础概念:
    • Serialization:序列化,使Java对象到Json字符串的过程。
    • Deserialization:反序列化,字符串转换成Java对象
  • Gson的两个基础方法:
    • toJson(); 将bean对象转换为json字符串
    • fromJson(); 将json字符串转为bean对象

Gson 框架的使用

  1. 在Android Studio中添加Gson框架

  2. 定义Json字符串对应的实体类(key - 属性)

  3. 使用Gson框架:

    1
    2
    3
    4
    // toJson 将bean对象转换为json字符串
    String jsonStr = gson.toJson(movie, Movie.class);
    // fromJson 将json字符串转为bean对象
    Movie movie = gson.fromJson(jsonStr, Movie.class);

Gson 框架的注解

  1. @Expose注解
    serialize和deserialize属性可选,默认为true。
    serialize 为true:调用toJson时会序列化该属性,
    deserialize 为true:调用fromJson生成Java对象时不会进行反序列化。

    image-20210204154804426

注意:如果采用new Gson()方式创建Gson,@Expose没有任何效果

  1. @SerializedName注解
    能指定该字段在序列化成json时的名称。

    image-20210204154733814

注意:实际开发中我们会遇到比较复杂的Json,比如json中嵌套json数组,这个时候,就需要我们自定义序列化或反序列化方法了