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

更多相关文章

  1. Android(安卓)技巧 - listview 里面的图片不能响应onClick事件?
  2. Android(安卓)中数据库查询方法 query() 中的 selectionArgs 的
  3. Android(安卓)WebView选择图片、发送图片
  4. Android(安卓)列表数据写入到本地Excel文件(包括图片)
  5. ImageView的scaletype属性
  6. android 已省内存方式把图片加载到内存
  7. RadioButton和CheckBox自定义按钮图片的样式
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python技巧匿名函数、回调函数和高阶函数

随机推荐

  1. 在Android中,如何判断当前是否在桌面上
  2. Android(安卓)官方架构组件 Navigation
  3. Android(安卓)键盘开发心得
  4. Android异步加载全解析之大图处理
  5. Android(安卓)Service的思考(5)
  6. Android内存泄露问题分析
  7. Android中使用DrawerLayout的注意点
  8. Android(安卓)高级UI解密 (五) :PathMeasu
  9. Android(安卓)Studio 中高德地图申请key
  10. Android手机上网、彩信APN设置