当我可以在添加方法中将 ImageRequest 对象类型转换为 Request 时,Singleton Class 在使用 Volley 下载图像时有什么用

What is use of Singleton Class in dowloading Image by using Volley when i could just Typecast ImageRequest object into Request in add method

使用 Volley 下载图像时,文档中建议使用单例 class。但是我可以在 add() 方法中传递参数的同时将 ImageRequest 类型转换为 Request 。它可以正常工作。那么使用 Singleton Class 而不是使用 this 有什么用呢。 这是代码,

package com.example.myvolleyimage;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.Volley;

public class MainActivity extends AppCompatActivity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final String url = "https://images.pexels.com/photos/3862601/pexels-photo-3862601.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260";

        Button button = (Button) findViewById(R.id.button);
        final ImageView imageView = (ImageView) findViewById(R.id.imageView);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
                ImageRequest imageRequest = new ImageRequest(url,
                        new Response.Listener<Bitmap>() {
                            @Override
                            public void onResponse(Bitmap response) {
                                imageView.setImageBitmap(response);
                            }
                        },0, 0,null,
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Log.i("Error","error IS " +error);
                            }
                        });

                requestQueue.add((Request)imageRequest);
            }
        });


    }
}

从技术上讲,您可以,但您并没有真正将图像排队并让 Volley 处理这些请求。拥有单个队列在不同情况下具有优势。例如:

  • 如果您正在加载带有图像的项目列表,单个队列允许 volley 处理优先级并优先考虑最近请求的图像,限制您一次下载的图像数量,等等

  • 每个队列实例化其他 类 创建线程。如果你同时有多个队列,你可能使用了比你需要的更多的内存,可能创建了比需要更多的线程并导致每个图像的线程切换。

没有什么能阻止您像您一样使用 Volley,但建议保留单个实例,以便向其添加请求更快且更节省资源