Android 中使用Volley进行网络请求和图片加载详解

简介: Android 中使用Volley进行网络请求和图片加载详解

前言:

Volley概述:

Volley既可以访问网络取得数据,也可以加载图片,并且在性能方面进行了大幅度的调整。它的设计目标就是适合进行数据量不大但通信频繁 的网络操作。而对于大数据量的网络操作,比如说下载文件等,Volley的表现却非常糟糕。

使用Volley前,需要在项目的build.gradle中引入相应的依赖:

implementation 'com.android.volley:volley:1.2.1'

一、使用Volley进行GET请求:

1.创建activity_volley.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".activity.VolleyActivity">
    <Button
        android:id="@+id/btn_volley_get"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="使用Volley进行默认的GET请求" />
    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

2.VolleyActivity代码如下:

public class VolleyActivity extends AppCompatActivity {
    private Button btn_volley_get;
    private TextView textView;
    private static final String TAG = "VolleyActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_volley);
        btn_volley_get = findViewById(R.id.btn_volley_get);
        textView = findViewById(R.id.textView);
        btn_volley_get.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
                StringRequest stringRequest = new StringRequest(Request.Method.GET, "http://www.baidu.com"
                        , new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        textView.setText(response);//请求的结果为百度界面的HTML文件
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.i(TAG, error.getMessage(), error);
                    }
                });
                //将请求添加到请求队列中
                requestQueue.add(stringRequest);
                }
        });
    }
}

具体效果如下:

二、使用Volley进行POST请求:

这里返回的数据是JSON格式,所以需要将JSON字符串转换成对应的Java实体类。

http://www.bejson.com/json2javapojo/ 这个网址可以将json字符串,转换为Java实体类。

实体类IpModel如下:

public class IpModel {
    @SerializedName("code")
    private int code;
    @SerializedName("data")
    private String data;
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getData() {
        return data;
    }
    public void setData(String data) {
        this.data = data;
    }
}

之后在VolleyActivity类中,点击按钮进行POST请求,代码如下:

public class VolleyActivity extends AppCompatActivity {
    private Button btn_volley_get;
    private static final String TAG = "VolleyActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_volley);
        btn_volley_get = findViewById(R.id.btn_volley_get);
        btn_volley_get.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
                JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST
                        , "https://ip.taobao.com/service/getIpInfo.php?ip=59.108.54.37",
                        null
                        , new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        IpModel ipModel = new Gson().fromJson(response.toString(), IpModel.class);
                        if (null != ipModel) {
                            Log.i(TAG, "data: " + ipModel.getData());
                            Log.i(TAG, "code:" + ipModel.getCode());
                        }
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e(TAG, error.getMessage(), error);
                    }
                });
                requestQueue.add(jsonObjectRequest);
            }
        });
    }
}

输出的log日志如下:

三、使用lmageRequest加载图片代码如下:

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
ImageRequest imageRequest = new ImageRequest("https://cdn.pixabay.com/photo/2021/12/13/15/14/flowers-6868494_960_720.jpg",
                        new Response.Listener<Bitmap>() {
                            @Override
                            public void onResponse(Bitmap response) {
                                imageView.setImageBitmap(response);
                            }
                        }, 0, 0, ImageView.ScaleType.FIT_XY,Bitmap.Config.RGB_565,new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        imageView.setImageResource(R.drawable.fan1);
                    }
                });
requestQueue.add(imageRequest);

四、使用lmageLoader加载图片代码如下:

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
                    @Nullable
                    @Override
                    public Bitmap getBitmap(String url) {
                        return null;
                    }
                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                    }
                });
                //第二个参数:默认先加载的图片。
                //第三个参数:没有网络,或者加载错误的情况下加载的图片。
                ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.fan1, R.drawable.ic_launcher);
                imageLoader.get("https://cdn.pixabay.com/photo/2021/12/13/15/14/flowers-6868494_960_720.jpg", listener, 0, 0);     

四、使用NetworklmageView加载图片

1、首先在布局文件中添加NetworkImageView控件

<com.android.volley.toolbox.NetworkImageView
        android:id="@+id/networkImageView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

在VolleyActivity中具体实现:

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
                    @Nullable
                    @Override
                    public Bitmap getBitmap(String url) {
                        return null;
                    }
                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                    }
                });
                networkImageView.setDefaultImageResId(R.drawable.fan1);
                networkImageView.setErrorImageResId(R.drawable.ic_launcher);
                networkImageView.setImageUrl("https://cdn.pixabay.com/photo/2021/12/13/15/14/flowers-6868494_960_720.jpg", imageLoader);


目录
相关文章
|
9天前
|
网络协议 Shell 网络安全
解决两个 Android 模拟器之间无法网络通信的问题
让同一个 PC 上运行的两个 Android 模拟器之间能相互通信,出(qiong)差(ren)的智慧。
17 3
|
3月前
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
122 56
|
3月前
|
安全 网络安全 Android开发
探索安卓开发之旅:从新手到专家网络安全与信息安全:防范网络威胁,保护数据安全
【8月更文挑战第29天】在这篇技术性文章中,我们将踏上一段激动人心的旅程,探索安卓开发的世界。无论你是刚开始接触编程的新手,还是希望提升技能的资深开发者,这篇文章都将为你提供宝贵的知识和指导。我们将从基础概念入手,逐步深入到安卓开发的高级主题,包括UI设计、数据存储、网络通信等方面。通过阅读本文,你将获得一个全面的安卓开发知识体系,并学会如何将这些知识应用到实际项目中。让我们一起开启这段探索之旅吧!
|
3月前
|
Java Android开发 Kotlin
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
32 0
|
3月前
|
Java Android开发 开发者
Android项目架构设计问题之使用Retrofit2作为网络库如何解决
Android项目架构设计问题之使用Retrofit2作为网络库如何解决
59 0
|
5月前
|
缓存 JSON 网络协议
Android面试题:App性能优化之电量优化和网络优化
这篇文章讨论了Android应用的电量和网络优化。电量优化涉及Doze和Standby模式,其中应用可能需要通过用户白名单或电池广播来适应限制。Battery Historian和Android Studio的Energy Profile是电量分析工具。建议减少不必要的操作,延迟非关键任务,合并网络请求。网络优化包括HTTPDNS减少DNS解析延迟,Keep-Alive复用连接,HTTP/2实现多路复用,以及使用protobuf和gzip压缩数据。其他策略如使用WebP图像格式,按网络质量提供不同分辨率的图片,以及启用HTTP缓存也是有效手段。
85 9
|
5月前
|
缓存 网络协议 安全
Android网络面试题之Http基础和Http1.0的特点
**HTTP基础:GET和POST关键差异在于参数传递方式(GET在URL,POST在请求体),安全性(POST更安全),数据大小限制(POST无限制,GET有限制),速度(GET较快)及用途(GET用于获取,POST用于提交)。面试中常强调POST的安全性、数据量、数据类型支持及速度。HTTP 1.0引入了POST和HEAD方法,支持多种数据格式和缓存,但每个请求需新建TCP连接。**
50 5
|
5月前
|
安全 网络协议 算法
Android网络基础面试题之HTTPS的工作流程和原理
HTTPS简述 HTTPS基于TCP 443端口,通过CA证书确保服务器身份,使用DH算法协商对称密钥进行加密通信。流程包括TCP握手、证书验证(公钥解密,哈希对比)和数据加密传输(随机数加密,预主密钥,对称加密)。特点是安全但慢,易受特定攻击,且依赖可信的CA。每次请求可能复用Session ID以减少握手。
62 2
|
5月前
|
缓存 网络协议 Android开发
Android网络面试题之Http1.1和Http2.0
HTTP/1.1 引入持久连接和管道机制提升效率,支持分块传输编码和更多请求方式如PUT、PATCH。Host字段指定服务器域名,RANGE用于断点续传。HTTP/2变为二进制协议,实现多工处理,头信息压缩和服务器推送,减少延迟并优化资源加载。HTTP不断发展,从早期的简单传输到后来的高效交互。
67 0
Android网络面试题之Http1.1和Http2.0
|
5月前
|
JSON Java API
【Android】使用 Retrofit2 发送异步网络请求的简单案例
**摘要:** Retrofit是Android和Java的HTTP客户端库,简化了RESTful API交互。它通过Java接口定义HTTP请求,并提供注解管理参数、HTTP方法等。要使用Retrofit,首先在AndroidManifest.xml中添加`INTERNET`权限,然后在`build.gradle`中引入Retrofit和Gson依赖。创建服务器响应数据类和描述接口的接口,如`Result`和`Api`。通过Retrofit.Builder配置基础URL并构建实例,之后调用接口方法创建Call对象并发送异步请求。
190 1