Volley加载图片的介绍及用法

来源:互联网 发布:linux 编译链接静态库 编辑:程序博客网 时间:2024/04/29 09:27

声明:
该文是参照慕客网视频所整理,参考链接:
http://www.imooc.com/learn/468

1.缓存功能简单介绍

 实现网络图片缓存:       LruCache       ImageCache

2.加载网络图片及监听

 网络图片加载:       ImageRequest       ImageLoader 网络图片的显示:       NetworkImageView       ImageView

3.实例一:使用ImageRequest实现网络图片加载
MyApplication.java

import android.app.Application;import com.android.volley.RequestQueue;import com.android.volley.toolbox.Volley;public class MyApplication extends Application{    public static RequestQueue queue;    @Override    public void onCreate() {        super.onCreate();        queue = Volley.newRequestQueue(getApplicationContext());    }    public static RequestQueue getHttpQueue(){        return queue;    }}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.learning.volleydemo06">    <uses-permission android:name="android.permission.INTERNET"/>    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme"        android:name=".MyApplication">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>

MainActivity.java

import android.graphics.Bitmap;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ImageView;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.toolbox.ImageRequest;public class MainActivity extends AppCompatActivity {    private ImageView imageView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        String url = "http://imgsrc.baidu.com/forum/w=580/sign=b6a55730c81b9d168ac79a69c3dfb4eb/b168d5c451da81cbf9b846225466d0160824318d.jpg";        /**         *  通过Volley加载网络图片         *         *  new ImageRequest(         *  String url,         *  Listener listener,         *  int maxWidth,         *  int maxHeight,         *  Config decodeConfig,         *  ErrorListener errorListener)         *         *  url:请求地址         *  listener:请求成功后的回调         *  maxWidth、maxHeight:设置图片的最大宽高,如果均设为0则表示按原尺寸显示         *  decodeConfig:图片像素的储存方式。         *              Config.RGB_565表示每个像素占2个字节,         *              Config.ARGB_8888表示每个像素占4个字节等。         *  errorListener:请求失败的回调         */        ImageRequest request = new ImageRequest(url,                new Response.Listener<Bitmap>() {                    @Override                    public void onResponse(Bitmap bitmap) {                        imageView.setImageBitmap(bitmap);                    }                }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError volleyError) {                imageView.setImageResource(R.mipmap.ic_launcher);            }        });        MyApplication.getHttpQueue().add(request);    }    private void initView(){        imageView = (ImageView) findViewById(R.id.iv_image);    }}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Hello World!" />    <ImageView        android:id="@+id/iv_image"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"/></LinearLayout>

运行结果:
这里写图片描述

4.实例二:使用ImageCache、LruCache、ImageLoader、ImageListener实现网络图片加载(单独使用ImageCache是起不到缓存效果的)

修改MainActivity.java如下:
MainActivity.java

import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.ImageView;import com.android.volley.toolbox.ImageLoader;public class MainActivity extends AppCompatActivity {    private ImageView imageView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        String url = "http://imgsrc.baidu.com/forum/w=580/sign=b6a55730c81b9d168ac79a69c3dfb4eb/b168d5c451da81cbf9b846225466d0160824318d.jpg";        ImageLoader loader = new ImageLoader(MyApplication.getHttpQueue(),                new BitmapCache());        //监听图片的加载过程        ImageLoader.ImageListener listener = ImageLoader.getImageListener(                imageView,//控件                R.mipmap.ic_launcher,//默认加载的图片                R.mipmap.ic_launcher);//出错时加载的图片        loader.get(url,listener);    }    private void initView(){        imageView = (ImageView) findViewById(R.id.iv_image);    }}

新建BitmapCache.java
BitmapCache.java

import android.annotation.TargetApi;import android.graphics.Bitmap;import android.os.Build;import android.util.LruCache;import com.android.volley.toolbox.ImageLoader;public class BitmapCache implements ImageLoader.ImageCache {    public LruCache<String,Bitmap> cache;    //LruCache最大缓存内存大小10M,超过则启动自动回收    public int max = 10 * 1024 * 1024;    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)    public BitmapCache(){        cache = new LruCache<String,Bitmap>(max){            @Override            //缓存图片的大小            protected int sizeOf(String key, Bitmap value) {                return value.getRowBytes() * value.getHeight();            }        };    }    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)    @Override    public Bitmap getBitmap(String s) {        return cache.get(s);    }    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)    @Override    public void putBitmap(String s, Bitmap bitmap) {        cache.put(s,bitmap);    }}

运行结果:
在网络不佳的时候,显示图片显示默认设置的图片
这里写图片描述

5.实例三:使用ImageCache、LruCache、ImageLoader、NetworkImageView实现网络图片加载(单独使用ImageCache是起不到缓存效果的)

修改上例中的activity_main.xml
activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Hello World!" />    <com.android.volley.toolbox.NetworkImageView        android:id="@+id/iv_netImage"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:layout_marginTop="30dp"/></LinearLayout>

修改MainActivity.java
MainActivity.java

import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.ImageView;import com.android.volley.toolbox.ImageLoader;import com.android.volley.toolbox.NetworkImageView;public class MainActivity extends AppCompatActivity {    private ImageView imageView;    private NetworkImageView networkImageView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        String url = "http://imgsrc.baidu.com/forum/w=580/sign=b6a55730c81b9d168ac79a69c3dfb4eb/b168d5c451da81cbf9b846225466d0160824318d.jpg";        ImageLoader loader = new ImageLoader(MyApplication.getHttpQueue(),                new BitmapCache());        networkImageView.setDefaultImageResId(R.mipmap.ic_launcher);        networkImageView.setErrorImageResId(R.mipmap.ic_launcher);        networkImageView.setImageUrl(url,loader);    }    private void initView(){        networkImageView = (NetworkImageView) findViewById(R.id.iv_netImage);    }}

运行结果:
这里写图片描述

0 0