Android(安卓)Volley框架(二):ImageRequest、ImageLoader、NetworkImageView
16lz
2021-12-10
Volley加载图片可以通过三种方式:ImageRequest、ImageLoader、NetworkImageView
直接上代码,使用说明见注释:
第一步 搭建环境
下载jar包,新建工程,导入volley.jar
第二步 AndroidManifest.xml 文件
打开网络权限 (<uses-permission android:name="android.permission.INTERNET" />)
引入MyApplication (android:name="com.example.volleyfrademo.MyApplication")
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.volleyfrademo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:name="com.example.volleyfrademo.MyApplication"> <activity android:name=".<span style="font-family: Arial;">MainActivity</span>" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
第三步 MyApplication.java 文件
package com.example.volleyfrademo;import com.android.volley.Request;import com.android.volley.RequestQueue;import com.android.volley.VolleyLog;import com.android.volley.toolbox.Volley;import android.app.Application;import android.text.TextUtils;public class MyApplication extends Application {public static final String TAG = "MyApplication";private RequestQueue queues;private static MyApplication instance;@Overridepublic void onCreate() {super.onCreate();instance = this;}public static synchronized MyApplication getInstance() { return instance; }public RequestQueue getRequestQueue(){if (queues == null) {queues = Volley.newRequestQueue(getApplicationContext()); }return queues;}public <T> void addToRequestQueue(Request<T> req, String tag) { req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); VolleyLog.d("Adding request to queue: %s", req.getUrl()); getRequestQueue().add(req);}public <T> void addToRequestQueue(Request<T> req) { req.setTag(TAG); getRequestQueue().add(req); }public void cancelPendingRequests(Object tag) { if (queues != null) { queues.cancelAll(tag); } }}
第四步 activity_image.xml文件
<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="com.example.volleyfrademo.MainActivity" > <ImageView android:id="@+id/img_resp1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <com.android.volley.toolbox.NetworkImageView android:id="@+id/network_image_view" android:layout_width="400dp" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" /> <Button android:id="@+id/btn_imagerequest" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通过ImageRequest加载图片" /> <Button android:id="@+id/btn_imageloader" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通过ImageLoader加载图片,无缓存" /> <Button android:id="@+id/btn_imageloader2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通过ImageLoader加载图片,有缓存" /> <Button android:id="@+id/btn_networkimageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通过NetworkImageView加载图片,无缓存" /> <Button android:id="@+id/btn_networkimageView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通过NetworkImageView加载图片,有缓存" /> </LinearLayout>
第五步ImageActivity.java文件
package com.example.volleyfrademo;import com.android.volley.VolleyError;import com.android.volley.Response.ErrorListener;import com.android.volley.Response.Listener;import com.android.volley.toolbox.ImageLoader;import com.android.volley.toolbox.ImageRequest;import com.android.volley.toolbox.NetworkImageView;import com.android.volley.toolbox.ImageLoader.ImageCache;import com.android.volley.toolbox.ImageLoader.ImageListener;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;public class ImageActivity extends Activity implements OnClickListener{private ImageView img_resp1;private NetworkImageView networkImageView;private Button btn_imagerequest, btn_imageloader, btn_imageloader2, btn_networkimageView, btn_networkimageView2;private String urlImageRequest = "http://p2.so.qhimg.com/t01258fd340b7d71ab7.gif";private String urlImageLoader = "http://img2.auyou.cn/grgl/hypic/200804/20084111205833137.jpg";private String urlImageLoader2 = "http://img.qzone.la/uploads/allimg/111103/1-111103025922-50.jpg";private String urlNetworkImageView = "http://att.bbs.duowan.com/forum/201309/07/160720kwxxsqlla4wjaxzs.jpg";private String urlNetworkImageView2 = "http://img4.duitang.com/uploads/item/201404/19/20140419172144_AGZNk.thumb.224_0.jpeg";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_image);initView();setEvent();}private void initView() {img_resp1 = (ImageView) findViewById(R.id.img_resp1);networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);btn_imagerequest = (Button) findViewById(R.id.btn_imagerequest);btn_imageloader = (Button) findViewById(R.id.btn_imageloader);btn_imageloader2 = (Button) findViewById(R.id.btn_imageloader2);btn_networkimageView = (Button) findViewById(R.id.btn_networkimageView);btn_networkimageView2 = (Button) findViewById(R.id.btn_networkimageView2);}private void setEvent() {btn_imagerequest.setOnClickListener(this);btn_imageloader.setOnClickListener(this);btn_imageloader2.setOnClickListener(this);btn_networkimageView.setOnClickListener(this);btn_networkimageView2.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.btn_imagerequest:volley_ImageRequest();break;case R.id.btn_imageloader:volley_ImageLoader();break;case R.id.btn_imageloader2:volley_ImageLoader2();break;case R.id.btn_networkimageView:volley_NetworkImageView();break;case R.id.btn_networkimageView2:volley_NetworkImageView2();break;}}/** * ImageRequest 加载图片 * ImageRequest的构造函数接收六个参数: * 第一个参数就是图片的URL地址,这个没什么需要解释的; * 第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中; * 第三第、四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩; * 第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小; * 第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。 */private void volley_ImageRequest() {ImageRequest request = new ImageRequest(urlImageRequest, new Listener<Bitmap>() {@Overridepublic void onResponse(Bitmap response) {img_resp1.setImageBitmap(response);}}, 0, 0, Config.RGB_565, new ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Toast.makeText(ImageActivity.this, error.toString(), 3000).show();img_resp1.setImageResource(R.drawable.ic_launcher);}});request.setTag("volley_ImageRequest");MyApplication.getInstance().addToRequestQueue(request);}/** * ImageLoader 加载图片,无缓存 */private void volley_ImageLoader(){/* * ImageLoader的构造函数接收两个参数: * 第一个参数就是RequestQueue对象 *第二个参数是一个ImageCache对象,这里我们先new出一个空的ImageCache的实现即可 */ImageLoader imgloader = new ImageLoader(MyApplication.getInstance().getRequestQueue(), new ImageCache() {@Overridepublic void putBitmap(String url, Bitmap bitmap) {}@Overridepublic Bitmap getBitmap(String url) {return null;}});/* * 我们通过调用ImageLoader的getImageListener()方法能够获取到一个ImageListener对象 * getImageListener()方法接收三个参数: * 第一个参数指定用于显示图片的ImageView控件 * 第二个参数指定加载图片的过程中显示的图片 * 第三个参数指定加载图片失败的情况下显示的图片 */ImageListener listener = ImageLoader.getImageListener(img_resp1, R.drawable.ic_launcher, R.drawable.ic_launcher);/* * get()方法接收两个参数: * 第一个参数就是图片的URL地址 * 第二个参数则是刚刚获取到的ImageListener对象。 * 当然,如果你想对图片的大小进行限制,也可以使用get()方法的重载,指定图片允许的最大宽度和高度 imgloader.get(url, listener, 200, 200) */imgloader.get(urlImageLoader, listener);}/** * ImageLoader 加载图片,有缓存 */private void volley_ImageLoader2(){/* * ImageLoader的构造函数接收两个参数: * 第一个参数就是RequestQueue对象 *第二个参数是一个ImageCache对象,这里我们先new出一个已经设置好的BitmapCache() */ImageLoader imgloader = new ImageLoader(MyApplication.getInstance().getRequestQueue(), new BitmapCache());ImageListener listener = ImageLoader.getImageListener(img_resp1, R.drawable.ic_launcher, R.drawable.ic_launcher);imgloader.get(urlImageLoader2, listener);}/** * NetworkImageView 加载图片,无缓存,图片大小在xml中限制 */private void volley_NetworkImageView(){//无缓存ImageLoader imgloader = new ImageLoader(MyApplication.getInstance().getRequestQueue(), new ImageCache() {@Overridepublic void putBitmap(String url, Bitmap bitmap) {}@Overridepublic Bitmap getBitmap(String url) {return null;}});networkImageView.setDefaultImageResId(R.drawable.default_image); networkImageView.setErrorImageResId(R.drawable.failed_image); networkImageView.setTag("volley_NetworkImageView"); networkImageView.setImageUrl(urlNetworkImageView, imgloader); }/** * NetworkImageView 加载图片,有缓存,图片大小在xml中限制 */private void volley_NetworkImageView2() {//有缓存ImageLoader imgloader = new ImageLoader(MyApplication.getInstance().getRequestQueue(), new BitmapCache());networkImageView.setDefaultImageResId(R.drawable.default_image); networkImageView.setErrorImageResId(R.drawable.failed_image); networkImageView.setTag("volley_NetworkImageView2"); networkImageView.setImageUrl(urlNetworkImageView2, imgloader); }}
第六步BitmapCache.java
package com.example.volleyfrademo;import android.graphics.Bitmap;import android.util.LruCache;import com.android.volley.toolbox.ImageLoader.ImageCache;/** * 对应volley_ImageLoader2 * * 新建一个BitmapCache并实现了ImageCache接口 * 这里我们将缓存图片的大小设置为10M * * @author jiatao */public class BitmapCache implements ImageCache{private LruCache<String, Bitmap> mCache; public BitmapCache() { int maxSize = 10 * 1024 * 1024; 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); } }
更多相关文章
- Android(安卓)技巧 - listview 里面的图片不能响应onClick事件?
- Android(安卓)中数据库查询方法 query() 中的 selectionArgs 的
- Android(安卓)WebView选择图片、发送图片
- Android(安卓)列表数据写入到本地Excel文件(包括图片)
- ImageView的scaletype属性
- android 已省内存方式把图片加载到内存
- RadioButton和CheckBox自定义按钮图片的样式
- mybatisplus的坑 insert标签insert into select无参数问题的解决
- Python技巧匿名函数、回调函数和高阶函数