IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 7.Android的网络编程-Volley和Gson框架 -> 正文阅读

[移动开发]7.Android的网络编程-Volley和Gson框架

HTTP协议简介

什么是HTTP协议?

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OlsMl4t7-1627189037278)(https://cdn.jsdelivr.net/gh/llz-github/image/img1/20210203150226.png)]

从图中可以看出,使用手机客户端访问百度时,会发送一个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界面设计

如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OTKc2xAq-1627189037282)(https://cdn.jsdelivr.net/gh/llz-github/image/img1/20210203161129.png)]

代码:

<?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框架

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

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

    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(二)

  • 进行图片缓存
    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类(见素材)

    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解析类。
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

加载豆瓣电影列表

  • 使用JsonObjectRequest加载豆瓣电影数据
  • 豆瓣电影列表
    • https://douban.uieee.com/v2/movie/in_theaters
    • https://api.douban.com/v2/movie/in_theaters
    • subjects - 电影列表
  • 使用BitmapCache类缓存电影图片
    – 提示:返回数据为Json数据:
    – JsonObjectRequest,JsonArrayRequest

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框架:

// 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对象时不会进行反序列化。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xSKdlJwQ-1627189037286)(https://cdn.jsdelivr.net/gh/llz-github/image/img1/20210204154849.png)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IIz0ThRk-1627189037290)(https://cdn.jsdelivr.net/gh/llz-github/image/img1/20210204154849.png)]

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

[外链图片转存中…(img-xSKdlJwQ-1627189037286)]

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

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

[外链图片转存中…(img-IIz0ThRk-1627189037290)]

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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:46:00  更:2021-07-29 11:46:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 16:49:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码