当我可以在添加方法中将 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,但建议保留单个实例,以便向其添加请求更快且更节省资源
使用 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,但建议保留单个实例,以便向其添加请求更快且更节省资源