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);


目录
相关文章
|
2月前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
4月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
39 0
|
4月前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
22 0
|
28天前
|
编解码 Android开发
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)1
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)
47 1
|
28天前
|
编解码 开发工具 Android开发
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
27 2
|
6天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
7天前
|
存储 应用服务中间件 网络安全
Android 网络链接稳定性测试解决方案
Android 网络链接稳定性测试解决方案
17 0
|
14天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
11 0
|
14天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
11 0
|
22天前
|
JSON 安全 Java
Android网络部分-----网络数据请求、解析
Android网络部分-----网络数据请求、解析
Android网络部分-----网络数据请求、解析